From 42205789c522f4116ecda59925bc2e5c72473830 Mon Sep 17 00:00:00 2001 From: vpage Date: Thu, 17 Jan 2019 12:28:03 -0500 Subject: [PATCH 01/22] Fixing deactivate route bug in webhook gateway --- Gopkg.lock | 79 ++++++++++++++++++++++++---------- common/util.go | 6 ++- gateways/core/webhook/start.go | 46 ++++++++++++-------- gateways/event-source_test.go | 10 ++--- gateways/event-sources.go | 6 +-- gateways/state_test.go | 3 +- gateways/utils_test.go | 2 +- sensors/event-handler.go | 2 +- sensors/event-handler_test.go | 26 +++++------ 9 files changed, 112 insertions(+), 68 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index c389b6eb15..0f7698b424 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -22,8 +22,8 @@ [[projects]] name = "github.com/Shopify/sarama" packages = ["."] - revision = "879f631812a30a580659e8035e7cda9994bb99ac" - version = "v1.20.0" + revision = "03a43f93cd29dc549e6d9b11892795c206f9c38c" + version = "v1.20.1" [[projects]] name = "github.com/argoproj/argo" @@ -31,7 +31,7 @@ "pkg/apis/workflow", "pkg/apis/workflow/v1alpha1" ] - revision = "3b52b26190163d1f72f3aef1a39f9f291378dafb" + revision = "0a928e93dac6d8522682931a0a68c52add310cdb" version = "v2.2.1" [[projects]] @@ -181,7 +181,7 @@ "ptypes/duration", "ptypes/timestamp" ] - revision = "1d3f30b51784bec5aad268e59fd3c2fc1c2fe73f" + revision = "347cf4a86c1cb8d262994d8ef5924d4576c5b331" [[projects]] branch = "master" @@ -217,6 +217,12 @@ revision = "7c663266750e7d82587642f65e60bc4083f1f84e" version = "v0.2.0" +[[projects]] + branch = "master" + name = "github.com/gopherjs/gopherjs" + packages = ["js"] + revision = "d547d1d9531ed93dbdebcbff7f83e7c876a1e0ee" + [[projects]] name = "github.com/hashicorp/golang-lru" packages = [ @@ -250,6 +256,12 @@ revision = "1624edc4454b8682399def8740d46db5e4362ba4" version = "v1.1.5" +[[projects]] + name = "github.com/jtolds/gls" + packages = ["."] + revision = "b4936e06046bbecbb94cae9c18127ebe510a2cb9" + version = "v4.20" + [[projects]] name = "github.com/konsorten/go-windows-terminal-sequences" packages = ["."] @@ -276,8 +288,8 @@ "pkg/s3utils", "pkg/set" ] - revision = "39381cf62425050629c7264228fc2f9e0c6616f6" - version = "v6.0.11" + revision = "e6694bcc4a6b0c1756797be85b8458635a65924e" + version = "v6.0.13" [[projects]] name = "github.com/mitchellh/go-homedir" @@ -368,6 +380,26 @@ revision = "e1e72e9de974bd926e5c56f83753fba2df402ce5" version = "v1.3.0" +[[projects]] + name = "github.com/smartystreets/assertions" + packages = [ + ".", + "internal/go-render/render", + "internal/oglematchers" + ] + revision = "7678a5452ebea5b7090a6b163f844c133f523da2" + version = "1.8.3" + +[[projects]] + name = "github.com/smartystreets/goconvey" + packages = [ + "convey", + "convey/gotest", + "convey/reporting" + ] + revision = "9e8dc3f972df6c8fcc0375ef492c24d0bb204857" + version = "1.6.3" + [[projects]] name = "github.com/spf13/pflag" packages = ["."] @@ -389,8 +421,8 @@ [[projects]] name = "github.com/tidwall/gjson" packages = ["."] - revision = "1e3f6aeaa5bad08d777ea7807b279a07885dd8b2" - version = "v1.1.3" + revision = "5a96cfda705e1762dc0671e26b0b78925ad97e29" + version = "v1.1.5" [[projects]] name = "github.com/tidwall/match" @@ -408,7 +440,7 @@ branch = "master" name = "github.com/xanzy/go-gitlab" packages = ["."] - revision = "294b2a04783ae9058544a6cba8642f335d6044bd" + revision = "d85a1530126065c71277db28196ec196daafc9dc" [[projects]] branch = "master" @@ -435,10 +467,11 @@ "internal/socks", "internal/timeseries", "proxy", + "publicsuffix", "trace", "websocket" ] - revision = "45ffb0cd1ba084b73e26dee67e667e1be5acce83" + revision = "915654e7eabcea33ae277abbecf52f0d8b7a9fdc" [[projects]] branch = "master" @@ -447,7 +480,7 @@ ".", "internal" ] - revision = "d668ce993890a79bda886613ee587a69dd5da7a6" + revision = "5dab4167f31cbd76b407f1486c86b40748bc5073" [[projects]] branch = "master" @@ -457,7 +490,7 @@ "unix", "windows" ] - revision = "20be8e55dc7b4b7a1b1660728164a8509d8c9209" + revision = "11f53e03133963fb11ae0588e08b5e0b85be8be5" [[projects]] name = "golang.org/x/text" @@ -503,7 +536,7 @@ "internal/gopathwalk", "internal/semver" ] - revision = "e063def13b29c433b3c57fc99257c18c1f9399ce" + revision = "b258f6da23835bf37e95cc50af792447c7c67fe4" [[projects]] name = "google.golang.org/appengine" @@ -523,7 +556,7 @@ branch = "master" name = "google.golang.org/genproto" packages = ["googleapis/rpc/status"] - revision = "bd9b4fb69e2ffd37621a6caa54dcbead29b546f2" + revision = "db91494dd46c1fdcbbde05e5ff5eb56df8f7d79a" [[projects]] name = "google.golang.org/grpc" @@ -560,8 +593,8 @@ "status", "tap" ] - revision = "df014850f6dee74ba2fc94874043a9f3f75fbfd8" - version = "v1.17.0" + revision = "a02b0774206b209466313a0b525d2c738fe407eb" + version = "v1.18.0" [[projects]] name = "gopkg.in/inf.v0" @@ -608,7 +641,7 @@ "storage/v1alpha1", "storage/v1beta1" ] - revision = "12444147eb1150aa5c80d2aae532cbc5b7be73d0" + revision = "c89978d5f86d7427bef2fc7752732c8c60b1d188" [[projects]] branch = "release-1.10" @@ -653,7 +686,7 @@ "pkg/watch", "third_party/forked/golang/reflect" ] - revision = "688d824527473e1e3f6c3f0b01171308393bdfe3" + revision = "d49e237a2683fa6dc43a86c7b1b766e0219fb6e7" [[projects]] branch = "release-7.0" @@ -746,7 +779,7 @@ "util/retry", "util/workqueue" ] - revision = "16a8a034ed284c656d27f043a57624e4873b7ad3" + revision = "36368dede29baa5ecd253416d70ddc0c76bde69b" [[projects]] branch = "release-1.10" @@ -778,7 +811,7 @@ "pkg/util", "third_party/forked/golang/reflect" ] - revision = "9de8e796a74d16d2a285165727d04c185ebca6dc" + revision = "edc41f23fa918716df540b1486477d62237010e4" [[projects]] branch = "master" @@ -793,7 +826,7 @@ "parser", "types" ] - revision = "fd15ee9cc2f77baa4f31e59e6acbf21146455073" + revision = "f8a0810f38afb8478882b3835a615aebfda39afa" [[projects]] name = "k8s.io/klog" @@ -811,11 +844,11 @@ "pkg/generators/rules", "pkg/util/sets" ] - revision = "0317810137be915b9cf888946c6e115c1bfac693" + revision = "ced9eb3070a5f1c548ef46e8dfe2a97c208d9f03" [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "72e54b8ccdc9546fdfea32ef9f72045588d58ffd4c2fd2d4fb85a6f9f82f48aa" + inputs-digest = "0279beee4b598248cdf46bb4d8e0bc6498ea338bf11af8f88d1eb8791c292a22" solver-name = "gps-cdcl" solver-version = 1 diff --git a/common/util.go b/common/util.go index d8ac700680..a206b6dc8f 100644 --- a/common/util.go +++ b/common/util.go @@ -70,14 +70,16 @@ func ServerResourceForGroupVersionKind(disco discovery.DiscoveryInterface, gvk s } // SendSuccessResponse sends http success response -func SendSuccessResponse(writer http.ResponseWriter) { +func SendSuccessResponse(writer http.ResponseWriter, response string) { writer.WriteHeader(http.StatusOK) + writer.Write([]byte(response)) writer.Write([]byte(SuccessResponse)) } // SendErrorResponse sends http error response -func SendErrorResponse(writer http.ResponseWriter) { +func SendErrorResponse(writer http.ResponseWriter, response string) { writer.WriteHeader(http.StatusBadRequest) + writer.Write([]byte(response)) writer.Write([]byte(ErrorResponse)) } diff --git a/gateways/core/webhook/start.go b/gateways/core/webhook/start.go index bdaea7cb48..1f1cc2b832 100644 --- a/gateways/core/webhook/start.go +++ b/gateways/core/webhook/start.go @@ -18,11 +18,11 @@ package webhook import ( "fmt" + "github.com/argoproj/argo-events/common" "io/ioutil" "net/http" "sync" - "github.com/argoproj/argo-events/common" "github.com/argoproj/argo-events/gateways" ) @@ -54,6 +54,7 @@ type routeConfig struct { wConfig *webhook eventSource *gateways.EventSource eventSourceExecutor *WebhookEventSourceExecutor + validRoute bool dataCh chan []byte doneCh chan struct{} errCh chan error @@ -72,7 +73,7 @@ func init() { case config := <-routeDeactivateChan: _, ok := activeServers[config.wConfig.Port] if ok { - config.wConfig.mux.HandleFunc(config.wConfig.Endpoint, config.routeDeactivateHandler) + config.validRoute = false } } } @@ -117,20 +118,33 @@ func (rc *routeConfig) startHttpServer() { // routeActiveHandler handles new route func (rc *routeConfig) routeActiveHandler(writer http.ResponseWriter, request *http.Request) { - rc.eventSourceExecutor.Log.Info().Str("endpoint", rc.wConfig.Endpoint).Str("http-method", request.Method).Msg("received a request") + var response string + logger := rc.eventSourceExecutor.Log.With().Str("endpoint", rc.wConfig.Endpoint).Str("http-method", request.Method) + if !rc.validRoute { + response = fmt.Sprintf("the route: endpoint %s and method %s is deactived", rc.wConfig.Endpoint, rc.wConfig.Method) + logger.Str("response", response).Logger().Info().Msg("endpoint is not active") + common.SendErrorResponse(writer, response) + return + } + if rc.wConfig.Method != request.Method { + msg := fmt.Sprintf("the method %s is not defined for endpoint %s", rc.wConfig.Method, rc.wConfig.Endpoint) + logger.Str("response", response).Logger().Info().Msg("endpoint is not active") + common.SendErrorResponse(writer, msg) + return + } + + logger.Str("response", response).Logger().Info().Msg("payload received") body, err := ioutil.ReadAll(request.Body) if err != nil { - rc.eventSourceExecutor.Log.Error().Err(err).Msg("failed to parse request body") - rc.errCh <- err + logger.Logger().Error().Err(err).Msg("failed to parse request body") + common.SendErrorResponse(writer, fmt.Sprintf("failed to parse request. err: %+v", err)) return } - rc.dataCh <- body -} -// routeDeactivateHandler handles routes that are not active -func (rc *routeConfig) routeDeactivateHandler(writer http.ResponseWriter, request *http.Request) { - rc.eventSourceExecutor.Log.Info().Str("endpoint", rc.wConfig.Endpoint).Str("http-method", request.Method).Msg("route is not active") - common.SendErrorResponse(writer) + response = "request successfully processed" + logger.Str("response", response).Logger().Info().Msg("request payload parsed successfully") + common.SendSuccessResponse(writer, response) + rc.dataCh <- body } // StartEventSource starts a event source @@ -147,7 +161,7 @@ func (ese *WebhookEventSourceExecutor) StartEventSource(eventSource *gateways.Ev wConfig: h, eventSource: eventSource, eventSourceExecutor: ese, - errCh: make(chan error), + validRoute: true, dataCh: make(chan []byte), doneCh: make(chan struct{}), startCh: make(chan struct{}), @@ -163,10 +177,9 @@ func (ese *WebhookEventSourceExecutor) StartEventSource(eventSource *gateways.Ev mutex.Unlock() } + ese.Log.Info().Str("event-source-name", eventSource.Name).Str("port", h.Port).Str("endpoint", h.Endpoint).Str("method", h.Method).Msg("adding route handler") rc.wConfig.mux.HandleFunc(rc.wConfig.Endpoint, rc.routeActiveHandler) - ese.Log.Info().Str("event-source-name", eventSource.Name).Str("port", h.Port).Str("endpoint", h.Endpoint).Str("method", h.Method).Msg("route handler added") - for { select { case data := <-rc.dataCh: @@ -176,13 +189,10 @@ func (ese *WebhookEventSourceExecutor) StartEventSource(eventSource *gateways.Ev Payload: data, }) if err != nil { + ese.Log.Error().Err(err).Str("event-source-name", eventSource.Name).Msg("failed to send event") return err } - case err := <-rc.errCh: - routeDeactivateChan <- rc - return err - case <-eventStream.Context().Done(): ese.Log.Info().Str("event-source-name", eventSource.Name).Msg("connection is closed by client") routeDeactivateChan <- rc diff --git a/gateways/event-source_test.go b/gateways/event-source_test.go index 1510976c4b..24fbbb57fa 100644 --- a/gateways/event-source_test.go +++ b/gateways/event-source_test.go @@ -8,21 +8,21 @@ import ( "testing" "github.com/argoproj/argo-events/common" + gwfake "github.com/argoproj/argo-events/pkg/client/gateway/clientset/versioned/fake" "github.com/smartystreets/goconvey/convey" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes/fake" - gwfake "github.com/argoproj/argo-events/pkg/client/gateway/clientset/versioned/fake" ) func getGatewayConfig() *GatewayConfig { return &GatewayConfig{ Log: common.GetLoggerContext(common.LoggerConf()).Logger(), serverPort: "1234", - StatusCh: make(chan EventSourceStatus), + StatusCh: make(chan EventSourceStatus), gw: &v1alpha1.Gateway{ ObjectMeta: metav1.ObjectMeta{ - Name: "test-agteway", + Name: "test-agteway", Namespace: "test-nm", }, Spec: v1alpha1.GatewaySpec{ @@ -32,7 +32,7 @@ func getGatewayConfig() *GatewayConfig { }, }, Clientset: fake.NewSimpleClientset(), - gwcs: gwfake.NewSimpleClientset(), + gwcs: gwfake.NewSimpleClientset(), } } @@ -40,7 +40,7 @@ type testEventSourceExecutor struct{} func (ese *testEventSourceExecutor) StartEventSource(eventSource *EventSource, eventStream Eventing_StartEventSourceServer) error { _ = eventStream.Send(&Event{ - Name: eventSource.Name, + Name: eventSource.Name, Payload: []byte("test payload"), }) return nil diff --git a/gateways/event-sources.go b/gateways/event-sources.go index 371fdb9193..066332cd07 100644 --- a/gateways/event-sources.go +++ b/gateways/event-sources.go @@ -227,10 +227,10 @@ func (gc *GatewayConfig) stopEventSources(configs []string) { eventSource := gc.registeredConfigs[configKey] gc.Log.Info().Str("event-source-name", eventSource.Data.Src).Msg("removing the event source") gc.StatusCh <- EventSourceStatus{ - Phase: v1alpha1.NodePhaseRemove, - Id: eventSource.Data.ID, + Phase: v1alpha1.NodePhaseRemove, + Id: eventSource.Data.ID, Message: "event_source_is_removed", - Name: eventSource.Data.Src, + Name: eventSource.Data.Src, } eventSource.Cancel() if err := eventSource.Conn.Close(); err != nil { diff --git a/gateways/state_test.go b/gateways/state_test.go index 4254d6845e..1dccffdd1b 100644 --- a/gateways/state_test.go +++ b/gateways/state_test.go @@ -53,14 +53,13 @@ func TestGatewayState(t *testing.T) { }, } - convey.Convey("Update gateway watchers", func() { gc.UpdateGatewayResourceState(&EventSourceStatus{ Phase: v1alpha1.NodePhaseResourceUpdate, Name: "test-node", Message: "gateway resource is updated", Id: "test-node", - Gw: updatedGw, + Gw: updatedGw, }) convey.So(len(gc.gw.Spec.Watchers.Sensors), convey.ShouldEqual, 1) }) diff --git a/gateways/utils_test.go b/gateways/utils_test.go index 11f5266cdd..6d6cf7e278 100644 --- a/gateways/utils_test.go +++ b/gateways/utils_test.go @@ -33,4 +33,4 @@ func TestGatewayUtil(t *testing.T) { convey.So(v.IsValid, convey.ShouldBeTrue) convey.So(v.Reason, convey.ShouldEqual, "event source is valid") }) -} \ No newline at end of file +} diff --git a/sensors/event-handler.go b/sensors/event-handler.go index 26fd7d3081..718051de63 100644 --- a/sensors/event-handler.go +++ b/sensors/event-handler.go @@ -135,7 +135,7 @@ func (sec *sensorExecutionCtx) processUpdateNotification(ew *updateNotification) case v1alpha1.ResourceUpdateNotification: sec.log.Info().Msg("sensor resource update") // update sensor resource - if !EqualEventDependencies(sec.sensor.Spec.EventDependencies, ew.sensor.Spec.EventDependencies) || !EqualTriggers(sec.sensor.Spec.Triggers, ew.sensor.Spec.Triggers){ + if !EqualEventDependencies(sec.sensor.Spec.EventDependencies, ew.sensor.Spec.EventDependencies) || !EqualTriggers(sec.sensor.Spec.Triggers, ew.sensor.Spec.Triggers) { sec.sensor = ew.sensor // initialize new event dependencies diff --git a/sensors/event-handler_test.go b/sensors/event-handler_test.go index 8a4033a106..297e9f4caf 100644 --- a/sensors/event-handler_test.go +++ b/sensors/event-handler_test.go @@ -79,13 +79,13 @@ func getSensor() (*v1alpha1.Sensor, error) { return &sensor, err } -type mockHttpWriter struct {} +type mockHttpWriter struct{} func (m *mockHttpWriter) Header() http.Header { return http.Header{} } -func (m *mockHttpWriter) Write([] byte) (int, error) { +func (m *mockHttpWriter) Write([]byte) (int, error) { return 0, nil } @@ -96,12 +96,12 @@ func (m *mockHttpWriter) WriteHeader(statusCode int) { func getsensorExecutionCtx(sensor *v1alpha1.Sensor) *sensorExecutionCtx { kubeClientset := fake.NewSimpleClientset() return &sensorExecutionCtx{ - kubeClient: kubeClientset, - discoveryClient: kubeClientset.Discovery().(*discoveryFake.FakeDiscovery), - clientPool: NewFakeClientPool(), - log: common.GetLoggerContext(common.LoggerConf()).Logger(), - sensorClient: sensorFake.NewSimpleClientset(), - sensor: sensor, + kubeClient: kubeClientset, + discoveryClient: kubeClientset.Discovery().(*discoveryFake.FakeDiscovery), + clientPool: NewFakeClientPool(), + log: common.GetLoggerContext(common.LoggerConf()).Logger(), + sensorClient: sensorFake.NewSimpleClientset(), + sensor: sensor, controllerInstanceID: "test-1", } } @@ -136,7 +136,7 @@ func TestEventHandler(t *testing.T) { convey.So(err, convey.ShouldBeNil) sec.sensor.Status.Nodes = make(map[string]v1alpha1.NodeStatus) - fmt.Println(sensor.NodeID( "test-gateway/test")) + fmt.Println(sensor.NodeID("test-gateway/test")) sensor2.InitializeNode(sec.sensor, "test-gateway/test", v1alpha1.NodeTypeEventDependency, &sec.log, "node is init") sensor2.MarkNodePhase(sec.sensor, "test-gateway/test", v1alpha1.NodeTypeEventDependency, v1alpha1.NodePhaseActive, nil, &sec.log, "node is active") @@ -144,9 +144,9 @@ func TestEventHandler(t *testing.T) { sensor2.InitializeNode(sec.sensor, "test-workflow-trigger", v1alpha1.NodeTypeTrigger, &sec.log, "trigger is init") sec.processUpdateNotification(&updateNotification{ - event: getCloudEvent(), + event: getCloudEvent(), notificationType: v1alpha1.EventNotification, - writer: &mockHttpWriter{}, + writer: &mockHttpWriter{}, eventDependency: &v1alpha1.EventDependency{ Name: "test-gateway/test", }, @@ -158,9 +158,9 @@ func TestEventHandler(t *testing.T) { Name: "test-gateway/test2", }) sec.processUpdateNotification(&updateNotification{ - event: nil, + event: nil, notificationType: v1alpha1.ResourceUpdateNotification, - writer: &mockHttpWriter{}, + writer: &mockHttpWriter{}, eventDependency: &v1alpha1.EventDependency{ Name: "test-gateway/test2", }, From 18fc9bbfd7a5acd456d90b578e35b5acc714a542 Mon Sep 17 00:00:00 2001 From: vpage Date: Thu, 17 Jan 2019 13:03:38 -0500 Subject: [PATCH 02/22] Fixing deactivate route bug in storage gateway --- gateways/custom/storagegrid/start.go | 34 +++++++++++++++------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/gateways/custom/storagegrid/start.go b/gateways/custom/storagegrid/start.go index 7f3468d08b..b37bc2c9d1 100644 --- a/gateways/custom/storagegrid/start.go +++ b/gateways/custom/storagegrid/start.go @@ -19,13 +19,13 @@ package storagegrid import ( "encoding/json" "fmt" + "github.com/argoproj/argo-events/common" "io/ioutil" "net/http" "net/url" "strings" "sync" - "github.com/argoproj/argo-events/common" "github.com/argoproj/argo-events/gateways" "github.com/joncalhoun/qson" "github.com/satori/go.uuid" @@ -67,6 +67,7 @@ type routeConfig struct { sgConfig *storageGrid eventSource *gateways.EventSource eventSourceExecutor *StorageGridEventSourceExecutor + validRoute bool dataCh chan []byte doneCh chan struct{} errCh chan error @@ -88,7 +89,7 @@ func init() { case config := <-routeDeactivateChan: _, ok := activeServers[config.sgConfig.Port] if ok { - config.sgConfig.mux.HandleFunc(config.sgConfig.Endpoint, config.routeDeactivateHandler) + config.validRoute = false } } } @@ -184,6 +185,7 @@ func (ese *StorageGridEventSourceExecutor) StartEventSource(eventSource *gateway sgConfig: sg, eventSource: eventSource, eventSourceExecutor: ese, + validRoute: true, errCh: make(chan error), dataCh: make(chan []byte), doneCh: make(chan struct{}), @@ -202,7 +204,9 @@ func (ese *StorageGridEventSourceExecutor) StartEventSource(eventSource *gateway rc.sgConfig.mux.HandleFunc(rc.sgConfig.Endpoint, rc.routeActiveHandler) - ese.Log.Info().Str("event-source-name", eventSource.Name).Str("port", sg.Port).Str("endpoint", sg.Endpoint).Msg("route handler added") + logger := ese.Log.With().Str("event-source-name", eventSource.Name).Str("port", sg.Port).Str("endpoint", sg.Endpoint) + + logger.Logger().Info().Msg("route handler added") for { select { @@ -213,15 +217,15 @@ func (ese *StorageGridEventSourceExecutor) StartEventSource(eventSource *gateway Payload: data, }) if err != nil { + logger.Logger().Error().Err(err).Msg("failed to send event") return err } case err := <-rc.errCh: - routeDeactivateChan <- rc - return err + logger.Logger().Error().Err(err).Msg("internal error occurred") case <-eventStream.Context().Done(): - ese.Log.Info().Str("event-source-name", eventSource.Name).Msg("connection is closed by client") + logger.Logger().Info().Msg("connection is closed by client") routeDeactivateChan <- rc return nil @@ -234,16 +238,20 @@ func (ese *StorageGridEventSourceExecutor) StartEventSource(eventSource *gateway // routeActiveHandler handles new route func (rc *routeConfig) routeActiveHandler(writer http.ResponseWriter, request *http.Request) { - rc.eventSourceExecutor.Log.Info().Str("endpoint", rc.sgConfig.Endpoint).Str("http-method", request.Method).Msg("received a request") + if !rc.validRoute { + rc.eventSourceExecutor.Log.Info().Str("event-source-name", rc.eventSource.Name).Str("method", http.MethodHead).Msg("deactived route") + common.SendErrorResponse(writer, "route is not valid") + return + } + + rc.eventSourceExecutor.Log.Info().Str("event-source-name", rc.eventSource.Name).Str("method", http.MethodHead).Msg("received a request") body, err := ioutil.ReadAll(request.Body) if err != nil { rc.eventSourceExecutor.Log.Error().Err(err).Msg("failed to parse request body") - rc.errCh <- err + common.SendErrorResponse(writer, "failed to parse request body") return } - rc.eventSourceExecutor.Log.Info().Str("event-source-name", rc.eventSource.Name).Str("method", http.MethodHead).Msg("received a request") - switch request.Method { case http.MethodHead: respBody = "" @@ -280,9 +288,3 @@ func (rc *routeConfig) routeActiveHandler(writer http.ResponseWriter, request *h rc.eventSourceExecutor.Log.Warn().Str("event-source-name", rc.eventSource.Name).Interface("notification", notification). Msg("discarding notification since it did not pass all filters") } - -// routeDeactivateHandler handles routes that are not active -func (rc *routeConfig) routeDeactivateHandler(writer http.ResponseWriter, request *http.Request) { - rc.eventSourceExecutor.Log.Info().Str("endpoint", rc.sgConfig.Endpoint).Str("http-method", request.Method).Msg("route is not active") - common.SendErrorResponse(writer) -} From 3614d53cb1010b827f1909ce0a0642d684aa45a9 Mon Sep 17 00:00:00 2001 From: vpage Date: Thu, 17 Jan 2019 16:46:17 -0500 Subject: [PATCH 03/22] fixing event source deactivation -> activation bug --- common/util.go | 2 - gateways/core/webhook/start.go | 46 ++++++++++++--------- gateways/core/webhook/validate.go | 20 +++++---- gateways/core/webhook/validate_test.go | 6 +-- gateways/custom/storagegrid/start.go | 54 +++++++++++++++---------- gateways/custom/storagegrid/validate.go | 22 +++++----- gateways/event-sources.go | 8 ++-- gateways/state.go | 6 +-- 8 files changed, 91 insertions(+), 73 deletions(-) diff --git a/common/util.go b/common/util.go index a206b6dc8f..94e5a9a227 100644 --- a/common/util.go +++ b/common/util.go @@ -73,14 +73,12 @@ func ServerResourceForGroupVersionKind(disco discovery.DiscoveryInterface, gvk s func SendSuccessResponse(writer http.ResponseWriter, response string) { writer.WriteHeader(http.StatusOK) writer.Write([]byte(response)) - writer.Write([]byte(SuccessResponse)) } // SendErrorResponse sends http error response func SendErrorResponse(writer http.ResponseWriter, response string) { writer.WriteHeader(http.StatusBadRequest) writer.Write([]byte(response)) - writer.Write([]byte(ErrorResponse)) } // LoggerConf returns standard logging configuration diff --git a/gateways/core/webhook/start.go b/gateways/core/webhook/start.go index 1f1cc2b832..c8cd03822d 100644 --- a/gateways/core/webhook/start.go +++ b/gateways/core/webhook/start.go @@ -32,6 +32,9 @@ var ( // activeServers keeps track of currently running http servers. activeServers = make(map[string]*activeServer) + // activeEndpoints keep track of endpoints that are already registered with server and their status active or deactive + activeEndpoints = make(map[string]*endpoint) + // routeActivateChan handles assigning new route to server. routeActivateChan = make(chan *routeConfig) @@ -54,13 +57,14 @@ type routeConfig struct { wConfig *webhook eventSource *gateways.EventSource eventSourceExecutor *WebhookEventSourceExecutor - validRoute bool - dataCh chan []byte - doneCh chan struct{} - errCh chan error startCh chan struct{} } +type endpoint struct { + active bool + dataCh chan []byte +} + func init() { go func() { for { @@ -73,7 +77,7 @@ func init() { case config := <-routeDeactivateChan: _, ok := activeServers[config.wConfig.Port] if ok { - config.validRoute = false + activeEndpoints[config.wConfig.Endpoint].active = false } } } @@ -119,38 +123,35 @@ func (rc *routeConfig) startHttpServer() { // routeActiveHandler handles new route func (rc *routeConfig) routeActiveHandler(writer http.ResponseWriter, request *http.Request) { var response string - logger := rc.eventSourceExecutor.Log.With().Str("endpoint", rc.wConfig.Endpoint).Str("http-method", request.Method) - if !rc.validRoute { + if !activeEndpoints[rc.wConfig.Endpoint].active { response = fmt.Sprintf("the route: endpoint %s and method %s is deactived", rc.wConfig.Endpoint, rc.wConfig.Method) - logger.Str("response", response).Logger().Info().Msg("endpoint is not active") + rc.eventSourceExecutor.Log.Info().Str("endpoint", rc.wConfig.Endpoint).Str("http-method", request.Method).Str("response", response).Msg("endpoint is not active") common.SendErrorResponse(writer, response) return } if rc.wConfig.Method != request.Method { msg := fmt.Sprintf("the method %s is not defined for endpoint %s", rc.wConfig.Method, rc.wConfig.Endpoint) - logger.Str("response", response).Logger().Info().Msg("endpoint is not active") + rc.eventSourceExecutor.Log.Info().Str("endpoint", rc.wConfig.Endpoint).Str("http-method", request.Method).Str("response", response).Msg("endpoint is not active") common.SendErrorResponse(writer, msg) return } - logger.Str("response", response).Logger().Info().Msg("payload received") + rc.eventSourceExecutor.Log.Info().Str("endpoint", rc.wConfig.Endpoint).Str("http-method", request.Method).Msg("payload received") body, err := ioutil.ReadAll(request.Body) if err != nil { - logger.Logger().Error().Err(err).Msg("failed to parse request body") + rc.eventSourceExecutor.Log.Error().Err(err).Str("endpoint", rc.wConfig.Endpoint).Str("http-method", request.Method).Str("response", response).Msg("failed to parse request body") common.SendErrorResponse(writer, fmt.Sprintf("failed to parse request. err: %+v", err)) return } + activeEndpoints[rc.wConfig.Endpoint].dataCh <- body response = "request successfully processed" - logger.Str("response", response).Logger().Info().Msg("request payload parsed successfully") + rc.eventSourceExecutor.Log.Info().Str("endpoint", rc.wConfig.Endpoint).Str("http-method", request.Method).Str("response", response).Msg("request payload parsed successfully") common.SendSuccessResponse(writer, response) - rc.dataCh <- body } // StartEventSource starts a event source func (ese *WebhookEventSourceExecutor) StartEventSource(eventSource *gateways.EventSource, eventStream gateways.Eventing_StartEventSourceServer) error { - defer gateways.Recover(eventSource.Name) - ese.Log.Info().Str("event-source-name", eventSource.Name).Msg("operating on event source") h, err := parseEventSource(eventSource.Data) if err != nil { @@ -161,9 +162,6 @@ func (ese *WebhookEventSourceExecutor) StartEventSource(eventSource *gateways.Ev wConfig: h, eventSource: eventSource, eventSourceExecutor: ese, - validRoute: true, - dataCh: make(chan []byte), - doneCh: make(chan struct{}), startCh: make(chan struct{}), } @@ -178,11 +176,19 @@ func (ese *WebhookEventSourceExecutor) StartEventSource(eventSource *gateways.Ev } ese.Log.Info().Str("event-source-name", eventSource.Name).Str("port", h.Port).Str("endpoint", h.Endpoint).Str("method", h.Method).Msg("adding route handler") - rc.wConfig.mux.HandleFunc(rc.wConfig.Endpoint, rc.routeActiveHandler) + if _, ok := activeEndpoints[rc.wConfig.Endpoint]; !ok { + activeEndpoints[rc.wConfig.Endpoint] = &endpoint{ + active: true, + dataCh: make(chan []byte), + } + rc.wConfig.mux.HandleFunc(rc.wConfig.Endpoint, rc.routeActiveHandler) + } + activeEndpoints[rc.wConfig.Endpoint].active = true + ese.Log.Info().Str("event-source-name", eventSource.Name).Str("port", h.Port).Str("endpoint", h.Endpoint).Str("method", h.Method).Msg("route handler added") for { select { - case data := <-rc.dataCh: + case data := <-activeEndpoints[rc.wConfig.Endpoint].dataCh: ese.Log.Info().Str("event-source-name", eventSource.Name).Msg("new event received, dispatching to gateway client") err := eventStream.Send(&gateways.Event{ Name: eventSource.Name, diff --git a/gateways/core/webhook/validate.go b/gateways/core/webhook/validate.go index 1454489ad4..22fe1844ae 100644 --- a/gateways/core/webhook/validate.go +++ b/gateways/core/webhook/validate.go @@ -28,18 +28,24 @@ import ( // ValidateEventSource validates webhook event source func (ese *WebhookEventSourceExecutor) ValidateEventSource(ctx context.Context, es *gateways.EventSource) (*gateways.ValidEventSource, error) { - v := &gateways.ValidEventSource{} w, err := parseEventSource(es.Data) if err != nil { - gateways.SetValidEventSource(v, fmt.Sprintf("%s. err: %s", gateways.ErrEventSourceParseFailed, err.Error()), false) - return v, gateways.ErrEventSourceParseFailed + return &gateways.ValidEventSource{ + Reason: fmt.Sprintf("%s. err: %s", gateways.ErrEventSourceParseFailed, err.Error()), + IsValid: false, + }, nil } + if err = validateWebhook(w); err != nil { - gateways.SetValidEventSource(v, err.Error(), false) - return v, gateways.ErrInvalidEventSource + return &gateways.ValidEventSource{ + Reason: err.Error(), + IsValid: false, + }, nil } - gateways.SetValidEventSource(v, "", true) - return v, nil + return &gateways.ValidEventSource{ + IsValid: true, + Reason: "valid", + }, nil } func validateWebhook(w *webhook) error { diff --git a/gateways/core/webhook/validate_test.go b/gateways/core/webhook/validate_test.go index 33b197c633..087ae8835a 100644 --- a/gateways/core/webhook/validate_test.go +++ b/gateways/core/webhook/validate_test.go @@ -37,12 +37,11 @@ method: "POST" func TestValidateNatsEventSource(t *testing.T) { convey.Convey("Given a valid webhook event source spec, parse it and make sure no error occurs", t, func() { ese := &WebhookEventSourceExecutor{} - valid, err := ese.ValidateEventSource(context.Background(), &gateways.EventSource{ + valid, _ := ese.ValidateEventSource(context.Background(), &gateways.EventSource{ Name: configKey, Id: configId, Data: configValue, }) - convey.So(err, convey.ShouldBeNil) convey.So(valid, convey.ShouldNotBeNil) convey.So(valid.IsValid, convey.ShouldBeTrue) }) @@ -53,12 +52,11 @@ func TestValidateNatsEventSource(t *testing.T) { endpoint: "/bar" port: "10000" ` - valid, err := ese.ValidateEventSource(context.Background(), &gateways.EventSource{ + valid, _ := ese.ValidateEventSource(context.Background(), &gateways.EventSource{ Data: invalidConfig, Id: configId, Name: configKey, }) - convey.So(err, convey.ShouldNotBeNil) convey.So(valid, convey.ShouldNotBeNil) convey.So(valid.IsValid, convey.ShouldBeFalse) convey.So(valid.Reason, convey.ShouldNotBeEmpty) diff --git a/gateways/custom/storagegrid/start.go b/gateways/custom/storagegrid/start.go index b37bc2c9d1..7f80726e69 100644 --- a/gateways/custom/storagegrid/start.go +++ b/gateways/custom/storagegrid/start.go @@ -37,6 +37,9 @@ var ( // activeServers keeps track of currently running http servers. activeServers = make(map[string]*activeServer) + // activeEndpoints keep track of endpoints that are already registered with server and their status active or deactive + activeEndpoints = make(map[string]*endpoint) + // mutex synchronizes activeRoutes routesMutex sync.Mutex // activeRoutes keep track of active routes for a http server @@ -67,13 +70,15 @@ type routeConfig struct { sgConfig *storageGrid eventSource *gateways.EventSource eventSourceExecutor *StorageGridEventSourceExecutor - validRoute bool - dataCh chan []byte - doneCh chan struct{} - errCh chan error startCh chan struct{} } +type endpoint struct { + active bool + dataCh chan []byte + errCh chan error +} + func init() { go func() { for { @@ -89,7 +94,7 @@ func init() { case config := <-routeDeactivateChan: _, ok := activeServers[config.sgConfig.Port] if ok { - config.validRoute = false + activeEndpoints[config.sgConfig.Endpoint].active = false } } } @@ -185,10 +190,6 @@ func (ese *StorageGridEventSourceExecutor) StartEventSource(eventSource *gateway sgConfig: sg, eventSource: eventSource, eventSourceExecutor: ese, - validRoute: true, - errCh: make(chan error), - dataCh: make(chan []byte), - doneCh: make(chan struct{}), startCh: make(chan struct{}), } @@ -202,30 +203,39 @@ func (ese *StorageGridEventSourceExecutor) StartEventSource(eventSource *gateway mutex.Unlock() } - rc.sgConfig.mux.HandleFunc(rc.sgConfig.Endpoint, rc.routeActiveHandler) + ese.Log.Info().Str("event-source-name", eventSource.Name).Str("port", sg.Port).Str("endpoint", sg.Endpoint).Msg("adding route handler") + if _, ok := activeEndpoints[rc.sgConfig.Endpoint]; !ok { + activeEndpoints[rc.sgConfig.Endpoint] = &endpoint{ + active: true, + dataCh: make(chan []byte), + errCh: make(chan error), + } + rc.sgConfig.mux.HandleFunc(rc.sgConfig.Endpoint, rc.routeActiveHandler) + } + activeEndpoints[rc.sgConfig.Endpoint].active = true - logger := ese.Log.With().Str("event-source-name", eventSource.Name).Str("port", sg.Port).Str("endpoint", sg.Endpoint) + ese.Log.Info().Str("event-source-name", eventSource.Name).Str("port", sg.Port).Str("endpoint", sg.Endpoint).Msg("route handler added") - logger.Logger().Info().Msg("route handler added") + ese.Log.Info().Str("event-source-name", eventSource.Name).Str("port", sg.Port).Str("endpoint", sg.Endpoint).Msg("route handler added") for { select { - case data := <-rc.dataCh: + case data := <-activeEndpoints[rc.sgConfig.Endpoint].dataCh: ese.Log.Info().Msg("received data") err := eventStream.Send(&gateways.Event{ Name: eventSource.Name, Payload: data, }) if err != nil { - logger.Logger().Error().Err(err).Msg("failed to send event") + ese.Log.Error().Err(err).Str("event-source-name", eventSource.Name).Str("port", sg.Port).Str("endpoint", sg.Endpoint).Msg("failed to send event") return err } - case err := <-rc.errCh: - logger.Logger().Error().Err(err).Msg("internal error occurred") + case err := <-activeEndpoints[rc.sgConfig.Endpoint].errCh: + ese.Log.Error().Err(err).Str("event-source-name", eventSource.Name).Str("port", sg.Port).Str("endpoint", sg.Endpoint).Msg("internal error occurred") case <-eventStream.Context().Done(): - logger.Logger().Info().Msg("connection is closed by client") + ese.Log.Info().Str("event-source-name", eventSource.Name).Str("port", sg.Port).Str("endpoint", sg.Endpoint).Msg("connection is closed by client") routeDeactivateChan <- rc return nil @@ -238,7 +248,7 @@ func (ese *StorageGridEventSourceExecutor) StartEventSource(eventSource *gateway // routeActiveHandler handles new route func (rc *routeConfig) routeActiveHandler(writer http.ResponseWriter, request *http.Request) { - if !rc.validRoute { + if !activeEndpoints[rc.sgConfig.Endpoint].active { rc.eventSourceExecutor.Log.Info().Str("event-source-name", rc.eventSource.Name).Str("method", http.MethodHead).Msg("deactived route") common.SendErrorResponse(writer, "route is not valid") return @@ -263,25 +273,25 @@ func (rc *routeConfig) routeActiveHandler(writer http.ResponseWriter, request *h // notification received from storage grid is url encoded. parsedURL, err := url.QueryUnescape(string(body)) if err != nil { - rc.errCh <- err + activeEndpoints[rc.sgConfig.Endpoint].errCh <- err return } b, err := qson.ToJSON(parsedURL) if err != nil { - rc.errCh <- err + activeEndpoints[rc.sgConfig.Endpoint].errCh <- err return } var notification *storageGridNotification err = json.Unmarshal(b, ¬ification) if err != nil { - rc.errCh <- err + activeEndpoints[rc.sgConfig.Endpoint].errCh <- err return } if filterEvent(notification, rc.sgConfig) && filterName(notification, rc.sgConfig) { rc.eventSourceExecutor.Log.Info().Str("event-source-name", rc.eventSource.Name).Msg("new event received, dispatching to gateway client") - rc.dataCh <- b + activeEndpoints[rc.sgConfig.Endpoint].dataCh <- b return } diff --git a/gateways/custom/storagegrid/validate.go b/gateways/custom/storagegrid/validate.go index c3b77eec75..d3112bc89e 100644 --- a/gateways/custom/storagegrid/validate.go +++ b/gateways/custom/storagegrid/validate.go @@ -26,21 +26,23 @@ import ( // ValidateEventSource validates gateway event source func (ese *StorageGridEventSourceExecutor) ValidateEventSource(ctx context.Context, es *gateways.EventSource) (*gateways.ValidEventSource, error) { - v := &gateways.ValidEventSource{} sg, err := parseEventSource(es.Data) if err != nil { - return v, gateways.ErrEventSourceParseFailed - } - if err != nil { - gateways.SetValidEventSource(v, fmt.Sprintf("%s. err: %s", gateways.ErrEventSourceParseFailed, err.Error()), false) - return v, nil + return &gateways.ValidEventSource{ + IsValid: false, + Reason: fmt.Sprintf("failed to parse event source. err: %+v", err), + }, nil } if err = validateStorageGrid(sg); err != nil { - gateways.SetValidEventSource(v, err.Error(), false) - return v, gateways.ErrInvalidEventSource + return &gateways.ValidEventSource{ + Reason: err.Error(), + IsValid: false, + }, nil } - gateways.SetValidEventSource(v, "", true) - return v, nil + return &gateways.ValidEventSource{ + IsValid: true, + Reason: "valid", + }, nil } func validateStorageGrid(sg *storageGrid) error { diff --git a/gateways/event-sources.go b/gateways/event-sources.go index 066332cd07..282dee6dbe 100644 --- a/gateways/event-sources.go +++ b/gateways/event-sources.go @@ -134,12 +134,11 @@ func (gc *GatewayConfig) startEventSources(eventSources map[string]*EventSourceC } // validate event source - valid, err := eventSource.Client.ValidateEventSource(eventSource.Ctx, &EventSource{ + if valid, _ := eventSource.Client.ValidateEventSource(eventSource.Ctx, &EventSource{ Data: eventSource.Data.Config, Name: eventSource.Data.Src, - }) - if err != nil || !valid.IsValid { - gc.Log.Error().Str("event-source-name", eventSource.Data.Src).Err(err).Str("validation-failure", valid.Reason).Msg("event source is not valid") + }); !valid.IsValid { + gc.Log.Error().Str("event-source-name", eventSource.Data.Src).Str("validation-failure", valid.Reason).Msg("event source is not valid") if err := eventSource.Conn.Close(); err != nil { gc.Log.Error().Str("event-source-name", eventSource.Data.Src).Err(err).Msg("failed to close client connection") } @@ -225,6 +224,7 @@ func (gc *GatewayConfig) startEventSources(eventSources map[string]*EventSourceC func (gc *GatewayConfig) stopEventSources(configs []string) { for _, configKey := range configs { eventSource := gc.registeredConfigs[configKey] + delete(gc.registeredConfigs, configKey) gc.Log.Info().Str("event-source-name", eventSource.Data.Src).Msg("removing the event source") gc.StatusCh <- EventSourceStatus{ Phase: v1alpha1.NodePhaseRemove, diff --git a/gateways/state.go b/gateways/state.go index 3e1852d668..87c3c43680 100644 --- a/gateways/state.go +++ b/gateways/state.go @@ -104,13 +104,11 @@ func (gc *GatewayConfig) UpdateGatewayResourceState(status *EventSourceStatus) { gc.markGatewayNodePhase(status) case v1alpha1.NodePhaseResourceUpdate: - if gc.gw.Spec.Watchers != status.Gw.Spec.Watchers { - gc.gw = status.Gw - gc.updated = true - } + gc.gw = status.Gw case v1alpha1.NodePhaseRemove: delete(gc.gw.Status.Nodes, status.Id) + gc.Log.Info().Str("event-source-name", status.Name).Msg("event source is removed") gc.updated = true } From ae13847d6d8f1217ba7ad19468e41b441e3203ba Mon Sep 17 00:00:00 2001 From: vpage Date: Thu, 17 Jan 2019 17:35:07 -0500 Subject: [PATCH 04/22] Started adding support for NATS streaming --- gateways/transformer.go | 5 +++++ pkg/apis/gateway/v1alpha1/types.go | 17 +++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/gateways/transformer.go b/gateways/transformer.go index 5ca2704f9f..c3fc7a140d 100644 --- a/gateways/transformer.go +++ b/gateways/transformer.go @@ -110,6 +110,11 @@ func (gc *GatewayConfig) dispatchEventOverHttp(event *sv1alpha.Event) error { return nil } +// dispatchEventOverNats dispatches event over nats streaming +func (gc *GatewayConfig) dispatchEventOverNatsStreaming(event *sv1alpha.Event) error { + +} + // postCloudEventToWatcher makes a HTTP POST call to watcher's service func (gc *GatewayConfig) postCloudEventToWatcher(host string, port string, endpoint string, payload []byte) error { req, err := http.NewRequest("POST", fmt.Sprintf("http://%s:%s%s", host, port, endpoint), bytes.NewBuffer(payload)) diff --git a/pkg/apis/gateway/v1alpha1/types.go b/pkg/apis/gateway/v1alpha1/types.go index 2659490681..615a1cb9be 100644 --- a/pkg/apis/gateway/v1alpha1/types.go +++ b/pkg/apis/gateway/v1alpha1/types.go @@ -170,3 +170,20 @@ type SensorNotificationWatcher struct { // Name is name of the sensor Name string `json:"name" protobuf:"bytes,1,opt,name=name"` } + +// Dispatch protocol contains configuration necessary to dispatch an event to sensor over different communication protocols +type DispatchProtocol struct { + Type string `json:"type" protobuf:"bytes,1,opt,name=type"` + + Http Http `json:"http" protobuf:"bytes,2,opt,name=http"` + + Nats Nats `json:"nats" protobuf:"bytes,3,opt,name=nats"` +} + +type Http struct { + Port string `json:"port" protobuf:"bytes,1,opt,name=port"` +} + +type Nats struct { + Nats string `json:"nats" protobuf:"bytes,1,opt,name=nats"` +} From 60486dc49a16388a421f8dee542489bee57a18eb Mon Sep 17 00:00:00 2001 From: vpage Date: Sat, 19 Jan 2019 08:46:47 -0500 Subject: [PATCH 05/22] Started working on supporting nats standard and streaming for communication between gateway and sensor --- Gopkg.lock | 34 +- Gopkg.toml | 16 +- Makefile | 2 +- controllers/sensor/operator.go | 4 +- controllers/sensor/validate.go | 2 +- gateways/config.go | 18 +- gateways/transformer.go | 34 +- pkg/apis/gateway/v1alpha1/generated.pb.go | 767 +++++++-- pkg/apis/gateway/v1alpha1/generated.proto | 22 +- .../gateway/v1alpha1/openapi_generated.go | 90 +- pkg/apis/gateway/v1alpha1/types.go | 13 +- .../gateway/v1alpha1/zz_generated.deepcopy.go | 51 + pkg/apis/sensor/v1alpha1/generated.pb.go | 1425 ++++++++++++++--- pkg/apis/sensor/v1alpha1/generated.proto | 55 +- pkg/apis/sensor/v1alpha1/openapi_generated.go | 200 ++- pkg/apis/sensor/v1alpha1/types.go | 83 +- .../sensor/v1alpha1/zz_generated.deepcopy.go | 59 +- .../gateway/clientset/versioned/clientset.go | 2 - .../versioned/fake/clientset_generated.go | 9 +- .../clientset/versioned/fake/register.go | 16 +- .../clientset/versioned/scheme/register.go | 16 +- .../gateway/v1alpha1/fake/fake_gateway.go | 2 +- .../informers/externalversions/factory.go | 61 +- .../sensor/clientset/versioned/clientset.go | 2 - .../versioned/fake/clientset_generated.go | 9 +- .../clientset/versioned/fake/register.go | 16 +- .../clientset/versioned/scheme/register.go | 16 +- .../typed/sensor/v1alpha1/fake/fake_sensor.go | 2 +- .../informers/externalversions/factory.go | 61 +- sensors/config.go | 11 + sensors/event-handler.go | 113 +- sensors/event-handler_test.go | 2 +- sensors/http-events-handler.go | 82 + sensors/nats-events-handler.go | 129 ++ sensors/trigger.go | 2 +- 35 files changed, 2870 insertions(+), 556 deletions(-) create mode 100644 sensors/http-events-handler.go create mode 100644 sensors/nats-events-handler.go diff --git a/Gopkg.lock b/Gopkg.lock index 0f7698b424..9051b01ccf 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -79,8 +79,8 @@ ".", "log" ] - revision = "3eb9738c1697594ea6e71a7156a9bb32ed216cf0" - version = "v2.8.0" + revision = "e37671aced663c8d3a395bd301857e26dcf4340c" + version = "v2.8.1" [[projects]] branch = "master" @@ -192,8 +192,8 @@ [[projects]] name = "github.com/google/go-github" packages = ["github"] - revision = "a5cb647b1fac8ba77e1cf25af2f9526658ab63e3" - version = "v21.0.0" + revision = "56cb1dd99043eba2e21c91aa8417d3ba2329259a" + version = "v21.0.1" [[projects]] name = "github.com/google/go-querystring" @@ -319,6 +319,15 @@ revision = "13c7fc7590db68b18f2015600f8765a02d705b5d" version = "v1.7.0" +[[projects]] + branch = "master" + name = "github.com/nats-io/go-nats-streaming" + packages = [ + ".", + "pb" + ] + revision = "a0e3aee6fce1a77efe4024df3280416e9d99bb98" + [[projects]] name = "github.com/nats-io/nkeys" packages = ["."] @@ -536,7 +545,7 @@ "internal/gopathwalk", "internal/semver" ] - revision = "b258f6da23835bf37e95cc50af792447c7c67fe4" + revision = "16909d206f00da7d0d5ba28cd9dc7fb223648ecf" [[projects]] name = "google.golang.org/appengine" @@ -609,7 +618,7 @@ version = "v2.2.2" [[projects]] - branch = "release-1.10" + branch = "release-1.12" name = "k8s.io/api" packages = [ "admissionregistration/v1alpha1", @@ -641,10 +650,10 @@ "storage/v1alpha1", "storage/v1beta1" ] - revision = "c89978d5f86d7427bef2fc7752732c8c60b1d188" + revision = "6db15a15d2d3874a6c3ddb2140ac9f3bc7058428" [[projects]] - branch = "release-1.10" + branch = "release-1.12" name = "k8s.io/apimachinery" packages = [ "pkg/api/errors", @@ -675,6 +684,7 @@ "pkg/util/framer", "pkg/util/intstr", "pkg/util/json", + "pkg/util/naming", "pkg/util/net", "pkg/util/runtime", "pkg/util/sets", @@ -686,7 +696,7 @@ "pkg/watch", "third_party/forked/golang/reflect" ] - revision = "d49e237a2683fa6dc43a86c7b1b766e0219fb6e7" + revision = "49ce2735e5074ffc3f8190c8406cf51a96302dad" [[projects]] branch = "release-7.0" @@ -782,7 +792,7 @@ revision = "36368dede29baa5ecd253416d70ddc0c76bde69b" [[projects]] - branch = "release-1.10" + branch = "release-1.12" name = "k8s.io/code-generator" packages = [ "cmd/client-gen", @@ -811,7 +821,7 @@ "pkg/util", "third_party/forked/golang/reflect" ] - revision = "edc41f23fa918716df540b1486477d62237010e4" + revision = "b1289fc74931d4b6b04bd1a259acfc88a2cb0a66" [[projects]] branch = "master" @@ -849,6 +859,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "0279beee4b598248cdf46bb4d8e0bc6498ea338bf11af8f88d1eb8791c292a22" + inputs-digest = "7b07bc2e199faf8ba2c6fe985f78c1a65564dfcb077228e28f723aab5af83e7d" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 7224beef2f..0974228d32 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -12,6 +12,14 @@ required = [ "github.com/gogo/protobuf/protoc-gen-gogofast", ] +[[constraint]] + name = "k8s.io/code-generator" + branch = "release-1.12" + +[[constraint]] + name = "github.com/nats-io/go-nats-streaming" + branch = "master" + [[constraint]] name = "github.com/smartystreets/goconvey" version = "1.6.3" @@ -24,10 +32,6 @@ required = [ name = "github.com/golang/protobuf" branch = "master" -[[constraint]] - name = "k8s.io/code-generator" - branch = "release-1.10" - [[constraint]] name = "github.com/eclipse/paho.mqtt.golang" version = "1.1.1" @@ -73,11 +77,11 @@ required = [ branch = "master" [[override]] - branch = "release-1.10" + branch = "release-1.12" name = "k8s.io/api" [[override]] - branch = "release-1.10" + branch = "release-1.12" name = "k8s.io/apimachinery" [[override]] diff --git a/Makefile b/Makefile index 0169cfca35..1aced5d3f2 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ override LDFLAGS += \ # docker image publishing options DOCKER_PUSH=true IMAGE_NAMESPACE=argoproj -IMAGE_TAG=v0.7 +IMAGE_TAG=v0.6.1 ifeq (${DOCKER_PUSH},true) ifndef IMAGE_NAMESPACE diff --git a/controllers/sensor/operator.go b/controllers/sensor/operator.go index aee46dee88..03e2f7fe5c 100644 --- a/controllers/sensor/operator.go +++ b/controllers/sensor/operator.go @@ -101,7 +101,7 @@ func (soc *sOperationCtx) operate() error { } // Initialize all event dependency nodes - for _, eventDependency := range soc.s.Spec.EventDependencies { + for _, eventDependency := range soc.s.Spec.Dependencies { InitializeNode(soc.s, eventDependency.Name, v1alpha1.NodeTypeEventDependency, &soc.log) } @@ -184,7 +184,7 @@ func (soc *sOperationCtx) operate() error { } // Mark all eventDependency nodes as active - for _, eventDependency := range soc.s.Spec.EventDependencies { + for _, eventDependency := range soc.s.Spec.Dependencies { MarkNodePhase(soc.s, eventDependency.Name, v1alpha1.NodeTypeEventDependency, v1alpha1.NodePhaseActive, nil, &soc.log, "node is active") } diff --git a/controllers/sensor/validate.go b/controllers/sensor/validate.go index 2ab6106771..720de21671 100644 --- a/controllers/sensor/validate.go +++ b/controllers/sensor/validate.go @@ -29,7 +29,7 @@ import ( // the error is ignored by the operation context as subsequent re-queues would produce the same error. // Exporting this function so that external APIs can use this to validate sensor resource. func ValidateSensor(s *v1alpha1.Sensor) error { - if err := validateSignals(s.Spec.EventDependencies); err != nil { + if err := validateSignals(s.Spec.Dependencies); err != nil { return err } err := validateTriggers(s.Spec.Triggers) diff --git a/gateways/config.go b/gateways/config.go index 9e48c64a4d..241cd95eb6 100644 --- a/gateways/config.go +++ b/gateways/config.go @@ -18,6 +18,8 @@ package gateways import ( "context" + "fmt" + "github.com/nats-io/go-nats" "os" "github.com/argoproj/argo-events/common" @@ -58,6 +60,10 @@ type GatewayConfig struct { controllerInstanceID string // StatusCh is used to communicate the status of an event source StatusCh chan EventSourceStatus + // natsConn is the nast client used to publish events to cluster. Only used if dispatch protocol is NATS + natsConn *nats.Conn + // sensorHttpPort is the http server running in sensor that listens to event. Only used if dispatch protocol is HTTP + sensorHttpPort string } // EventSourceContext contains information of a event source for gateway to run. @@ -127,7 +133,7 @@ func NewGatewayConfiguration() *GatewayConfig { panic(err) } - return &GatewayConfig{ + gc := &GatewayConfig{ Log: common.GetLoggerContext(common.LoggerConf()).Str("gateway-name", name).Str("gateway-namespace", namespace).Logger(), Clientset: clientset, Namespace: namespace, @@ -141,4 +147,14 @@ func NewGatewayConfiguration() *GatewayConfig { serverPort: serverPort, StatusCh: make(chan EventSourceStatus), } + + switch gw.Spec.DispatchProtocol.Type { + case v1alpha1.HTTPGateway: + gc.sensorHttpPort = gw.Spec.DispatchProtocol.Http.Port + case v1alpha1.NATSGateway: + if gc.natsConn, err = nats.Connect(gw.Spec.DispatchProtocol.Nats.URL); err != nil { + panic(fmt.Errorf("failed to connect to NATS cluster. err: %+v", err)) + } + } + return gc } diff --git a/gateways/transformer.go b/gateways/transformer.go index c3fc7a140d..e5ac255a41 100644 --- a/gateways/transformer.go +++ b/gateways/transformer.go @@ -44,10 +44,15 @@ func (gc *GatewayConfig) DispatchEvent(gatewayEvent *Event) error { if err != nil { return err } - switch gc.gw.Spec.DispatchProtocol { + + payload, err := json.Marshal(transformedEvent) + if err != nil { + return fmt.Errorf("failed to dispatch event to watchers over http. marshalling failed. err: %+v", err) + } + + switch gc.gw.Spec.DispatchProtocol.Type { case v1alpha1.HTTPGateway: - err = gc.dispatchEventOverHttp(transformedEvent) - if err != nil { + if err = gc.dispatchEventOverHttp(transformedEvent.Context.Source.Host, payload); err != nil { return err } case v1alpha1.NATSGateway: @@ -87,22 +92,16 @@ func (gc *GatewayConfig) transformEvent(gatewayEvent *Event) (*sv1alpha.Event, e } // dispatchEventOverHttp dispatches event to watchers over http. -func (gc *GatewayConfig) dispatchEventOverHttp(event *sv1alpha.Event) error { - gc.Log.Info().Str("source", event.Context.Source.Host).Msg("dispatching event to watchers") +func (gc *GatewayConfig) dispatchEventOverHttp(source string, eventPayload []byte) error { + gc.Log.Info().Str("source", source).Msg("dispatching event to watchers") - payload, err := json.Marshal(event) - if err != nil { - return fmt.Errorf("failed to dispatch event to watchers over http. marshalling failed. err: %+v", err) - } for _, sensor := range gc.gw.Spec.Watchers.Sensors { - err := gc.postCloudEventToWatcher(common.DefaultServiceName(sensor.Name), common.SensorServicePort, common.SensorServiceEndpoint, payload) - if err != nil { + if err := gc.postCloudEventToWatcher(common.DefaultServiceName(sensor.Name), common.SensorServicePort, common.SensorServiceEndpoint, eventPayload); err != nil { return fmt.Errorf("failed to dispatch event to sensor watcher over http. communication error. err: %+v", err) } } for _, gateway := range gc.gw.Spec.Watchers.Gateways { - err := gc.postCloudEventToWatcher(common.DefaultServiceName(gateway.Name), gateway.Port, gateway.Endpoint, payload) - if err != nil { + if err := gc.postCloudEventToWatcher(common.DefaultServiceName(gateway.Name), gateway.Port, gateway.Endpoint, eventPayload); err != nil { return fmt.Errorf("failed to dispatch event to gateway watcher over http. communication error. err: %+v", err) } } @@ -111,8 +110,13 @@ func (gc *GatewayConfig) dispatchEventOverHttp(event *sv1alpha.Event) error { } // dispatchEventOverNats dispatches event over nats streaming -func (gc *GatewayConfig) dispatchEventOverNatsStreaming(event *sv1alpha.Event) error { - +func (gc *GatewayConfig) dispatchEventOverNatsStreaming(source string, eventPayload []byte) error { + if err := gc.natsConn.Publish(source, eventPayload); err != nil { + gc.Log.Error().Err(err).Str("source", source).Msg("failed to publish event") + return err + } + gc.Log.Info().Str("source", source).Msg("event published successfully") + return nil } // postCloudEventToWatcher makes a HTTP POST call to watcher's service diff --git a/pkg/apis/gateway/v1alpha1/generated.pb.go b/pkg/apis/gateway/v1alpha1/generated.pb.go index 6db0e9f907..1124a2ed39 100644 --- a/pkg/apis/gateway/v1alpha1/generated.pb.go +++ b/pkg/apis/gateway/v1alpha1/generated.pb.go @@ -41,10 +41,38 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package +func (m *DispatchProtocol) Reset() { *m = DispatchProtocol{} } +func (*DispatchProtocol) ProtoMessage() {} +func (*DispatchProtocol) Descriptor() ([]byte, []int) { + return fileDescriptor_generated_2651be823c5242a7, []int{0} +} +func (m *DispatchProtocol) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DispatchProtocol) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (dst *DispatchProtocol) XXX_Merge(src proto.Message) { + xxx_messageInfo_DispatchProtocol.Merge(dst, src) +} +func (m *DispatchProtocol) XXX_Size() int { + return m.Size() +} +func (m *DispatchProtocol) XXX_DiscardUnknown() { + xxx_messageInfo_DispatchProtocol.DiscardUnknown(m) +} + +var xxx_messageInfo_DispatchProtocol proto.InternalMessageInfo + func (m *Gateway) Reset() { *m = Gateway{} } func (*Gateway) ProtoMessage() {} func (*Gateway) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_98147a0c14cd8c1d, []int{0} + return fileDescriptor_generated_2651be823c5242a7, []int{1} } func (m *Gateway) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -72,7 +100,7 @@ var xxx_messageInfo_Gateway proto.InternalMessageInfo func (m *GatewayList) Reset() { *m = GatewayList{} } func (*GatewayList) ProtoMessage() {} func (*GatewayList) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_98147a0c14cd8c1d, []int{1} + return fileDescriptor_generated_2651be823c5242a7, []int{2} } func (m *GatewayList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -100,7 +128,7 @@ var xxx_messageInfo_GatewayList proto.InternalMessageInfo func (m *GatewayNotificationWatcher) Reset() { *m = GatewayNotificationWatcher{} } func (*GatewayNotificationWatcher) ProtoMessage() {} func (*GatewayNotificationWatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_98147a0c14cd8c1d, []int{2} + return fileDescriptor_generated_2651be823c5242a7, []int{3} } func (m *GatewayNotificationWatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -128,7 +156,7 @@ var xxx_messageInfo_GatewayNotificationWatcher proto.InternalMessageInfo func (m *GatewaySpec) Reset() { *m = GatewaySpec{} } func (*GatewaySpec) ProtoMessage() {} func (*GatewaySpec) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_98147a0c14cd8c1d, []int{3} + return fileDescriptor_generated_2651be823c5242a7, []int{4} } func (m *GatewaySpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -156,7 +184,7 @@ var xxx_messageInfo_GatewaySpec proto.InternalMessageInfo func (m *GatewayStatus) Reset() { *m = GatewayStatus{} } func (*GatewayStatus) ProtoMessage() {} func (*GatewayStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_98147a0c14cd8c1d, []int{4} + return fileDescriptor_generated_2651be823c5242a7, []int{5} } func (m *GatewayStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -181,10 +209,66 @@ func (m *GatewayStatus) XXX_DiscardUnknown() { var xxx_messageInfo_GatewayStatus proto.InternalMessageInfo +func (m *Http) Reset() { *m = Http{} } +func (*Http) ProtoMessage() {} +func (*Http) Descriptor() ([]byte, []int) { + return fileDescriptor_generated_2651be823c5242a7, []int{6} +} +func (m *Http) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Http) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (dst *Http) XXX_Merge(src proto.Message) { + xxx_messageInfo_Http.Merge(dst, src) +} +func (m *Http) XXX_Size() int { + return m.Size() +} +func (m *Http) XXX_DiscardUnknown() { + xxx_messageInfo_Http.DiscardUnknown(m) +} + +var xxx_messageInfo_Http proto.InternalMessageInfo + +func (m *Nats) Reset() { *m = Nats{} } +func (*Nats) ProtoMessage() {} +func (*Nats) Descriptor() ([]byte, []int) { + return fileDescriptor_generated_2651be823c5242a7, []int{7} +} +func (m *Nats) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Nats) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (dst *Nats) XXX_Merge(src proto.Message) { + xxx_messageInfo_Nats.Merge(dst, src) +} +func (m *Nats) XXX_Size() int { + return m.Size() +} +func (m *Nats) XXX_DiscardUnknown() { + xxx_messageInfo_Nats.DiscardUnknown(m) +} + +var xxx_messageInfo_Nats proto.InternalMessageInfo + func (m *NodeStatus) Reset() { *m = NodeStatus{} } func (*NodeStatus) ProtoMessage() {} func (*NodeStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_98147a0c14cd8c1d, []int{5} + return fileDescriptor_generated_2651be823c5242a7, []int{8} } func (m *NodeStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -212,7 +296,7 @@ var xxx_messageInfo_NodeStatus proto.InternalMessageInfo func (m *NotificationWatchers) Reset() { *m = NotificationWatchers{} } func (*NotificationWatchers) ProtoMessage() {} func (*NotificationWatchers) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_98147a0c14cd8c1d, []int{6} + return fileDescriptor_generated_2651be823c5242a7, []int{9} } func (m *NotificationWatchers) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -240,7 +324,7 @@ var xxx_messageInfo_NotificationWatchers proto.InternalMessageInfo func (m *SensorNotificationWatcher) Reset() { *m = SensorNotificationWatcher{} } func (*SensorNotificationWatcher) ProtoMessage() {} func (*SensorNotificationWatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_98147a0c14cd8c1d, []int{7} + return fileDescriptor_generated_2651be823c5242a7, []int{10} } func (m *SensorNotificationWatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -266,16 +350,57 @@ func (m *SensorNotificationWatcher) XXX_DiscardUnknown() { var xxx_messageInfo_SensorNotificationWatcher proto.InternalMessageInfo func init() { + proto.RegisterType((*DispatchProtocol)(nil), "github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.DispatchProtocol") proto.RegisterType((*Gateway)(nil), "github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.Gateway") proto.RegisterType((*GatewayList)(nil), "github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.GatewayList") proto.RegisterType((*GatewayNotificationWatcher)(nil), "github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.GatewayNotificationWatcher") proto.RegisterType((*GatewaySpec)(nil), "github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.GatewaySpec") proto.RegisterType((*GatewayStatus)(nil), "github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.GatewayStatus") proto.RegisterMapType((map[string]NodeStatus)(nil), "github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.GatewayStatus.NodesEntry") + proto.RegisterType((*Http)(nil), "github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.Http") + proto.RegisterType((*Nats)(nil), "github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.Nats") proto.RegisterType((*NodeStatus)(nil), "github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.NodeStatus") proto.RegisterType((*NotificationWatchers)(nil), "github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.NotificationWatchers") proto.RegisterType((*SensorNotificationWatcher)(nil), "github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.SensorNotificationWatcher") } +func (m *DispatchProtocol) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DispatchProtocol) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Type))) + i += copy(dAtA[i:], m.Type) + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Http.Size())) + n1, err := m.Http.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n1 + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Nats.Size())) + n2, err := m.Nats.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n2 + return i, nil +} + func (m *Gateway) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -294,27 +419,27 @@ func (m *Gateway) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n1, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n3, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n1 + i += n3 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n2, err := m.Status.MarshalTo(dAtA[i:]) + n4, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n2 + i += n4 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n3, err := m.Spec.MarshalTo(dAtA[i:]) + n5, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n3 + i += n5 return i, nil } @@ -336,11 +461,11 @@ func (m *GatewayList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n4, err := m.ListMeta.MarshalTo(dAtA[i:]) + n6, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n4 + i += n6 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -405,11 +530,11 @@ func (m *GatewaySpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.DeploySpec.Size())) - n5, err := m.DeploySpec.MarshalTo(dAtA[i:]) + n7, err := m.DeploySpec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n5 + i += n7 } dAtA[i] = 0x12 i++ @@ -427,21 +552,21 @@ func (m *GatewaySpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ServiceSpec.Size())) - n6, err := m.ServiceSpec.MarshalTo(dAtA[i:]) + n8, err := m.ServiceSpec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n6 + i += n8 } if m.Watchers != nil { dAtA[i] = 0x32 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Watchers.Size())) - n7, err := m.Watchers.MarshalTo(dAtA[i:]) + n9, err := m.Watchers.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n7 + i += n9 } dAtA[i] = 0x3a i++ @@ -449,8 +574,12 @@ func (m *GatewaySpec) MarshalTo(dAtA []byte) (int, error) { i += copy(dAtA[i:], m.ProcessorPort) dAtA[i] = 0x42 i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.DispatchProtocol))) - i += copy(dAtA[i:], m.DispatchProtocol) + i = encodeVarintGenerated(dAtA, i, uint64(m.DispatchProtocol.Size())) + n10, err := m.DispatchProtocol.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n10 return i, nil } @@ -476,11 +605,11 @@ func (m *GatewayStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StartedAt.Size())) - n8, err := m.StartedAt.MarshalTo(dAtA[i:]) + n11, err := m.StartedAt.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n8 + i += n11 dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Message))) @@ -509,16 +638,60 @@ func (m *GatewayStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n9, err := (&v).MarshalTo(dAtA[i:]) + n12, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n9 + i += n12 } } return i, nil } +func (m *Http) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Http) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Port))) + i += copy(dAtA[i:], m.Port) + return i, nil +} + +func (m *Nats) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Nats) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.URL))) + i += copy(dAtA[i:], m.URL) + return i, nil +} + func (m *NodeStatus) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -553,11 +726,11 @@ func (m *NodeStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StartedAt.Size())) - n10, err := m.StartedAt.MarshalTo(dAtA[i:]) + n13, err := m.StartedAt.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n10 + i += n13 dAtA[i] = 0x42 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Message))) @@ -565,11 +738,11 @@ func (m *NodeStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x4a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.UpdateTime.Size())) - n11, err := m.UpdateTime.MarshalTo(dAtA[i:]) + n14, err := m.UpdateTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n11 + i += n14 return i, nil } @@ -646,6 +819,21 @@ func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return offset + 1 } +func (m *DispatchProtocol) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Type) + n += 1 + l + sovGenerated(uint64(l)) + l = m.Http.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Nats.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *Gateway) Size() (n int) { if m == nil { return 0 @@ -719,7 +907,7 @@ func (m *GatewaySpec) Size() (n int) { } l = len(m.ProcessorPort) n += 1 + l + sovGenerated(uint64(l)) - l = len(m.DispatchProtocol) + l = m.DispatchProtocol.Size() n += 1 + l + sovGenerated(uint64(l)) return n } @@ -748,6 +936,28 @@ func (m *GatewayStatus) Size() (n int) { return n } +func (m *Http) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Port) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *Nats) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.URL) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *NodeStatus) Size() (n int) { if m == nil { return 0 @@ -816,6 +1026,18 @@ func sovGenerated(x uint64) (n int) { func sozGenerated(x uint64) (n int) { return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } +func (this *DispatchProtocol) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DispatchProtocol{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `Http:` + strings.Replace(strings.Replace(this.Http.String(), "Http", "Http", 1), `&`, ``, 1) + `,`, + `Nats:` + strings.Replace(strings.Replace(this.Nats.String(), "Nats", "Nats", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} func (this *Gateway) String() string { if this == nil { return "nil" @@ -863,7 +1085,7 @@ func (this *GatewaySpec) String() string { `ServiceSpec:` + strings.Replace(fmt.Sprintf("%v", this.ServiceSpec), "Service", "v11.Service", 1) + `,`, `Watchers:` + strings.Replace(fmt.Sprintf("%v", this.Watchers), "NotificationWatchers", "NotificationWatchers", 1) + `,`, `ProcessorPort:` + fmt.Sprintf("%v", this.ProcessorPort) + `,`, - `DispatchProtocol:` + fmt.Sprintf("%v", this.DispatchProtocol) + `,`, + `DispatchProtocol:` + strings.Replace(strings.Replace(this.DispatchProtocol.String(), "DispatchProtocol", "DispatchProtocol", 1), `&`, ``, 1) + `,`, `}`, }, "") return s @@ -891,6 +1113,26 @@ func (this *GatewayStatus) String() string { }, "") return s } +func (this *Http) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Http{`, + `Port:` + fmt.Sprintf("%v", this.Port) + `,`, + `}`, + }, "") + return s +} +func (this *Nats) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Nats{`, + `URL:` + fmt.Sprintf("%v", this.URL) + `,`, + `}`, + }, "") + return s +} func (this *NodeStatus) String() string { if this == nil { return "nil" @@ -936,6 +1178,145 @@ func valueToStringGenerated(v interface{}) string { pv := reflect.Indirect(rv).Interface() return fmt.Sprintf("*%v", pv) } +func (m *DispatchProtocol) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DispatchProtocol: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DispatchProtocol: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Type = DispatchProtocolType(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Http", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Http.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Nats", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Nats.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *Gateway) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -1572,7 +1953,7 @@ func (m *GatewaySpec) Unmarshal(dAtA []byte) error { if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field DispatchProtocol", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -1582,20 +1963,21 @@ func (m *GatewaySpec) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift + msglen |= (int(b) & 0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex > l { return io.ErrUnexpectedEOF } - m.DispatchProtocol = DispatchProtocolType(dAtA[iNdEx:postIndex]) + if err := m.DispatchProtocol.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -1879,6 +2261,164 @@ func (m *GatewayStatus) Unmarshal(dAtA []byte) error { } return nil } +func (m *Http) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Http: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Http: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Port", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Port = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Nats) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Nats: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Nats: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field URL", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.URL = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *NodeStatus) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -2431,75 +2971,80 @@ var ( ) func init() { - proto.RegisterFile("github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1/generated.proto", fileDescriptor_generated_98147a0c14cd8c1d) -} - -var fileDescriptor_generated_98147a0c14cd8c1d = []byte{ - // 1054 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x55, 0xcf, 0x6f, 0x1b, 0xc5, - 0x17, 0xcf, 0xda, 0x71, 0x6c, 0x8f, 0x93, 0x36, 0xdf, 0xf9, 0x06, 0xb1, 0x18, 0xc9, 0xa9, 0x7c, - 0x2a, 0x88, 0xee, 0x26, 0xe5, 0x87, 0x02, 0x88, 0x03, 0x4b, 0x42, 0x89, 0x44, 0xd2, 0x68, 0x9c, - 0x82, 0x44, 0x2b, 0xd1, 0xc9, 0xee, 0x64, 0x3d, 0x8d, 0x77, 0x67, 0xb4, 0x33, 0x76, 0xf1, 0xa9, - 0x48, 0xdc, 0x11, 0xff, 0x00, 0x47, 0xfe, 0x13, 0x24, 0xc2, 0xad, 0x07, 0x0e, 0x3d, 0x45, 0xc4, - 0xfc, 0x17, 0x3d, 0xa1, 0x99, 0x9d, 0xfd, 0x91, 0xc4, 0x51, 0x42, 0xdd, 0xdb, 0xce, 0xbc, 0xcf, - 0xfb, 0xbc, 0xf7, 0x3e, 0xef, 0xed, 0x1b, 0xb0, 0x1d, 0x52, 0xd9, 0x1f, 0x1e, 0x38, 0x3e, 0x8b, - 0x5c, 0x9c, 0x84, 0x8c, 0x27, 0xec, 0x89, 0xfe, 0xb8, 0x43, 0x46, 0x24, 0x96, 0xc2, 0xe5, 0x47, - 0xa1, 0x8b, 0x39, 0x15, 0x6e, 0x88, 0x25, 0x79, 0x8a, 0xc7, 0xee, 0x68, 0x1d, 0x0f, 0x78, 0x1f, - 0xaf, 0xbb, 0x21, 0x89, 0x49, 0x82, 0x25, 0x09, 0x1c, 0x9e, 0x30, 0xc9, 0xe0, 0xc7, 0x05, 0x95, - 0x93, 0x51, 0xe9, 0x8f, 0xef, 0x53, 0x2a, 0x87, 0x1f, 0x85, 0x8e, 0xa2, 0x72, 0x0c, 0x95, 0x93, - 0x51, 0xb5, 0xef, 0x94, 0xb2, 0x08, 0x59, 0xc8, 0x5c, 0xcd, 0x78, 0x30, 0x3c, 0xd4, 0x27, 0x7d, - 0xd0, 0x5f, 0x69, 0xa4, 0x76, 0xf7, 0x68, 0x43, 0x38, 0x94, 0xa9, 0xbc, 0x5c, 0x9f, 0x25, 0xc4, - 0x1d, 0x5d, 0xc8, 0xa6, 0xfd, 0x41, 0x81, 0x89, 0xb0, 0xdf, 0xa7, 0x31, 0x49, 0xc6, 0x45, 0x31, - 0x11, 0x91, 0x78, 0x9a, 0x97, 0x7b, 0x99, 0x57, 0x32, 0x8c, 0x25, 0x8d, 0xc8, 0x05, 0x87, 0x8f, - 0xae, 0x72, 0x10, 0x7e, 0x9f, 0x44, 0xf8, 0x82, 0xdf, 0xfb, 0x97, 0xf9, 0x0d, 0x25, 0x1d, 0xb8, - 0x34, 0x96, 0x42, 0x26, 0xe7, 0x9d, 0xba, 0x7f, 0x54, 0x40, 0xfd, 0x5e, 0xaa, 0x1d, 0x7c, 0x0c, - 0x1a, 0xaa, 0x88, 0x00, 0x4b, 0x6c, 0x5b, 0xb7, 0xac, 0xdb, 0xad, 0xbb, 0x6b, 0x4e, 0xca, 0xe9, - 0x94, 0x39, 0x0b, 0xd1, 0x15, 0xda, 0x19, 0xad, 0x3b, 0xf7, 0x0f, 0x9e, 0x10, 0x5f, 0xee, 0x10, - 0x89, 0x3d, 0x78, 0x7c, 0xb2, 0x3a, 0x37, 0x39, 0x59, 0x05, 0xc5, 0x1d, 0xca, 0x59, 0x21, 0x07, - 0x0b, 0x42, 0x62, 0x39, 0x14, 0x76, 0x45, 0xf3, 0x7f, 0xe5, 0xbc, 0x72, 0x83, 0x1d, 0x93, 0x75, - 0x4f, 0xf3, 0x79, 0x37, 0x4c, 0xdc, 0x85, 0xf4, 0x8c, 0x4c, 0x1c, 0xd8, 0x07, 0xf3, 0x82, 0x13, - 0xdf, 0xae, 0xea, 0x78, 0x5f, 0xbe, 0x86, 0x78, 0x9c, 0xf8, 0xde, 0xa2, 0x89, 0x36, 0xaf, 0x4e, - 0x48, 0x47, 0xe8, 0xfe, 0x65, 0x81, 0x96, 0xc1, 0x7c, 0x4d, 0x85, 0x84, 0x8f, 0x2e, 0xa8, 0xe9, - 0x5c, 0x4f, 0x4d, 0xe5, 0xad, 0xb5, 0x5c, 0x36, 0x51, 0x1a, 0xd9, 0x4d, 0x49, 0xc9, 0x10, 0xd4, - 0xa8, 0x24, 0x91, 0x12, 0xb2, 0x7a, 0xbb, 0x75, 0xd7, 0x9b, 0xbd, 0x30, 0x6f, 0xc9, 0x84, 0xab, - 0x6d, 0x2b, 0x62, 0x94, 0xf2, 0x77, 0x7f, 0xb6, 0x40, 0xdb, 0x20, 0x76, 0x99, 0xa4, 0x87, 0xd4, - 0xc7, 0x92, 0xb2, 0xf8, 0x5b, 0x2c, 0xfd, 0x3e, 0x49, 0xe0, 0x2d, 0x30, 0x1f, 0xe3, 0x88, 0xe8, - 0x0a, 0x9b, 0x85, 0x2e, 0xbb, 0x38, 0x22, 0x48, 0x5b, 0x14, 0x82, 0xb3, 0x44, 0xea, 0x8e, 0x97, - 0x10, 0x7b, 0x2c, 0x91, 0x48, 0x5b, 0xe0, 0x7b, 0xa0, 0x41, 0xe2, 0x80, 0x33, 0x1a, 0x4b, 0xdd, - 0xa7, 0x66, 0x51, 0xf9, 0x96, 0xb9, 0x47, 0x39, 0xa2, 0xfb, 0xe7, 0x7c, 0xae, 0xb3, 0x52, 0x1f, - 0xde, 0x03, 0x20, 0x20, 0x7c, 0xc0, 0xf4, 0xc9, 0x28, 0xfd, 0x66, 0x49, 0x69, 0x47, 0xfd, 0xce, - 0x4a, 0xd7, 0x3d, 0x16, 0x78, 0x37, 0xd4, 0x68, 0x6e, 0xe6, 0x70, 0x54, 0x72, 0x85, 0x2e, 0x68, - 0xfa, 0x2c, 0x3e, 0xa4, 0x61, 0x84, 0xb9, 0xc9, 0xf6, 0x7f, 0x26, 0x8f, 0xe6, 0x17, 0xda, 0xb0, - 0x83, 0x39, 0x2a, 0x30, 0xaa, 0x32, 0x39, 0xe6, 0xc4, 0xe4, 0x9c, 0x57, 0xb6, 0x3f, 0xe6, 0x04, - 0x69, 0x0b, 0xdc, 0x00, 0x8b, 0x5a, 0xfe, 0x6f, 0x48, 0x22, 0x28, 0x8b, 0xed, 0x79, 0x8d, 0x5c, - 0x31, 0xc8, 0xc5, 0xad, 0x92, 0x0d, 0x9d, 0x41, 0xc2, 0x5d, 0xd0, 0x12, 0x24, 0x19, 0x51, 0x9f, - 0xe8, 0xb2, 0x6a, 0xba, 0xac, 0xb7, 0xa7, 0x95, 0xd5, 0x4b, 0x61, 0xde, 0xcd, 0xc9, 0xc9, 0x6a, - 0xab, 0x57, 0xf8, 0xa0, 0x32, 0x01, 0x1c, 0x83, 0xc6, 0xd3, 0xb4, 0x65, 0xc2, 0x5e, 0xd0, 0x64, - 0xf7, 0x67, 0x18, 0x99, 0x29, 0x93, 0x20, 0xbc, 0x45, 0xd5, 0xb0, 0xec, 0x84, 0xf2, 0x70, 0xf0, - 0x53, 0xb0, 0xc4, 0x13, 0xe6, 0x13, 0x21, 0x58, 0xa2, 0xba, 0x6e, 0xd7, 0xb5, 0x0a, 0x6f, 0x18, - 0x15, 0x96, 0xf6, 0xca, 0x46, 0x74, 0x16, 0x0b, 0x1f, 0x81, 0xe5, 0x80, 0x0a, 0xae, 0xb8, 0xf6, - 0xd4, 0xc2, 0xf2, 0xd9, 0xc0, 0x6e, 0x68, 0xff, 0x35, 0xe3, 0xbf, 0xbc, 0x79, 0xce, 0xfe, 0xf2, - 0x64, 0x75, 0xe5, 0xfc, 0x9d, 0xee, 0xc9, 0x05, 0xa6, 0xee, 0xef, 0x55, 0xb0, 0x74, 0x66, 0x8f, - 0xc0, 0x35, 0x50, 0xe3, 0x7d, 0x2c, 0xb2, 0x81, 0x6e, 0x67, 0xff, 0xc4, 0x9e, 0xba, 0x7c, 0x79, - 0xb2, 0xda, 0xdc, 0x65, 0x01, 0xd1, 0x07, 0x94, 0x02, 0xe1, 0x43, 0xd0, 0x14, 0x12, 0x27, 0x92, - 0x04, 0x9f, 0x4b, 0xb3, 0xd6, 0xde, 0xbd, 0xde, 0x8f, 0xbe, 0x4f, 0x23, 0x52, 0x8c, 0x58, 0x2f, - 0x23, 0x41, 0x05, 0x1f, 0x7c, 0x07, 0xd4, 0x23, 0x22, 0x04, 0x0e, 0x89, 0x99, 0x9d, 0x9b, 0x06, - 0x5e, 0xdf, 0x49, 0xaf, 0x51, 0x66, 0x87, 0x3f, 0x80, 0x5a, 0xcc, 0x02, 0x22, 0xec, 0x9a, 0xde, - 0x08, 0xbd, 0xd7, 0xb5, 0x5a, 0x1d, 0x55, 0xb1, 0xd8, 0x8a, 0x65, 0x52, 0x5a, 0x11, 0xfa, 0x0e, - 0xa5, 0x01, 0xdb, 0xcf, 0x00, 0x28, 0x30, 0x70, 0x19, 0x54, 0x8f, 0xc8, 0x38, 0xd5, 0x0f, 0xa9, - 0x4f, 0xf8, 0x10, 0xd4, 0x46, 0x78, 0x30, 0x24, 0x46, 0x9d, 0xad, 0x99, 0x06, 0x2f, 0x20, 0x66, - 0xc3, 0xa7, 0x9c, 0x9f, 0x54, 0x36, 0xac, 0xee, 0x6f, 0xd5, 0x34, 0x03, 0xd3, 0xc3, 0x36, 0xa8, - 0xd0, 0xc0, 0x34, 0x10, 0x98, 0x8c, 0x2b, 0xdb, 0x9b, 0xa8, 0x42, 0x83, 0x7c, 0x5f, 0x55, 0x2f, - 0xdd, 0x57, 0x1f, 0x82, 0x96, 0x9a, 0x93, 0x01, 0x1e, 0xab, 0x4b, 0xfd, 0xe7, 0x35, 0xbd, 0xff, - 0x1b, 0x60, 0x6b, 0xb3, 0x30, 0xa1, 0x32, 0xae, 0x18, 0x9c, 0x85, 0xeb, 0x0e, 0xce, 0xe3, 0xf2, - 0xe0, 0xd4, 0xb5, 0x34, 0xee, 0xf5, 0x06, 0x67, 0x87, 0xfa, 0x09, 0xfb, 0x6f, 0xd3, 0xd3, 0xb8, - 0x62, 0x7a, 0x7c, 0x00, 0x86, 0x3c, 0xc0, 0x92, 0x28, 0x5a, 0xbb, 0xf9, 0x6a, 0xd9, 0xe4, 0x8f, - 0xff, 0x83, 0x9c, 0x0a, 0x95, 0x68, 0xbb, 0xbf, 0x56, 0xc0, 0xca, 0xb4, 0xd5, 0x01, 0x7f, 0xb2, - 0x40, 0xc3, 0xf4, 0x5a, 0xd8, 0x96, 0x9e, 0xdf, 0x07, 0xb3, 0xcf, 0xef, 0x94, 0x50, 0xc5, 0xcb, - 0x62, 0x30, 0x02, 0xe5, 0x81, 0xe1, 0x33, 0x50, 0x17, 0x24, 0x16, 0x2c, 0xc9, 0x5e, 0xd5, 0xfd, - 0x19, 0x72, 0xe8, 0x69, 0xa6, 0x69, 0x29, 0xe4, 0x4d, 0x48, 0x21, 0x02, 0x65, 0x51, 0xbb, 0x9f, - 0x81, 0xb7, 0x2e, 0x75, 0xbb, 0xfa, 0xa5, 0xf5, 0x9c, 0xe3, 0xd3, 0xce, 0xdc, 0xf3, 0xd3, 0xce, - 0xdc, 0x8b, 0xd3, 0xce, 0xdc, 0x8f, 0x93, 0x8e, 0x75, 0x3c, 0xe9, 0x58, 0xcf, 0x27, 0x1d, 0xeb, - 0xc5, 0xa4, 0x63, 0xfd, 0x3d, 0xe9, 0x58, 0xbf, 0xfc, 0xd3, 0x99, 0xfb, 0xae, 0x91, 0xa5, 0xf8, - 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xce, 0x61, 0x67, 0x54, 0xa9, 0x0b, 0x00, 0x00, + proto.RegisterFile("github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1/generated.proto", fileDescriptor_generated_2651be823c5242a7) +} + +var fileDescriptor_generated_2651be823c5242a7 = []byte{ + // 1136 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0xcf, 0x6f, 0x1b, 0x45, + 0x14, 0xce, 0xfa, 0x47, 0x6c, 0x8f, 0x93, 0x36, 0x0c, 0x45, 0x18, 0x23, 0x9c, 0x68, 0x05, 0x52, + 0x40, 0x74, 0xb7, 0x89, 0x00, 0x05, 0x10, 0x42, 0x2c, 0x09, 0x6d, 0x44, 0x93, 0x46, 0xe3, 0x04, + 0x24, 0x8a, 0x44, 0x27, 0xbb, 0x93, 0xf5, 0x36, 0xde, 0x9d, 0xd1, 0xce, 0xd8, 0xc5, 0xa7, 0x22, + 0x71, 0x47, 0xc0, 0x9d, 0x23, 0xff, 0x09, 0x12, 0x39, 0xf6, 0xc0, 0xa1, 0xa7, 0x88, 0x98, 0xff, + 0xa2, 0x17, 0xd0, 0xcc, 0xce, 0xfe, 0x48, 0x9c, 0x28, 0xa1, 0xee, 0x6d, 0xe7, 0xcd, 0xf7, 0xbe, + 0xf7, 0xde, 0x37, 0x6f, 0xde, 0x2c, 0xd8, 0xf4, 0x03, 0xd1, 0x1b, 0xec, 0x5b, 0x2e, 0x0d, 0x6d, + 0x1c, 0xfb, 0x94, 0xc5, 0xf4, 0xa1, 0xfa, 0xb8, 0x49, 0x86, 0x24, 0x12, 0xdc, 0x66, 0x87, 0xbe, + 0x8d, 0x59, 0xc0, 0x6d, 0x1f, 0x0b, 0xf2, 0x08, 0x8f, 0xec, 0xe1, 0x0a, 0xee, 0xb3, 0x1e, 0x5e, + 0xb1, 0x7d, 0x12, 0x91, 0x18, 0x0b, 0xe2, 0x59, 0x2c, 0xa6, 0x82, 0xc2, 0x0f, 0x73, 0x2a, 0x2b, + 0xa5, 0x52, 0x1f, 0xdf, 0x25, 0x54, 0x16, 0x3b, 0xf4, 0x2d, 0x49, 0x65, 0x69, 0x2a, 0x2b, 0xa5, + 0x6a, 0xdf, 0x2c, 0x64, 0xe1, 0x53, 0x9f, 0xda, 0x8a, 0x71, 0x7f, 0x70, 0xa0, 0x56, 0x6a, 0xa1, + 0xbe, 0x92, 0x48, 0x6d, 0xf3, 0x70, 0x8d, 0x5b, 0x01, 0x95, 0x79, 0xd9, 0x2e, 0x8d, 0x89, 0x3d, + 0x9c, 0xc8, 0xa6, 0xfd, 0x5e, 0x8e, 0x09, 0xb1, 0xdb, 0x0b, 0x22, 0x12, 0x8f, 0xf2, 0x62, 0x42, + 0x22, 0xf0, 0x79, 0x5e, 0xf6, 0x45, 0x5e, 0xf1, 0x20, 0x12, 0x41, 0x48, 0x26, 0x1c, 0x3e, 0xb8, + 0xcc, 0x81, 0xbb, 0x3d, 0x12, 0xe2, 0xb3, 0x7e, 0xe6, 0xaf, 0x25, 0xb0, 0xb0, 0x1e, 0x70, 0x86, + 0x85, 0xdb, 0xdb, 0x91, 0x16, 0x97, 0xf6, 0xe1, 0x1a, 0xa8, 0x88, 0x11, 0x23, 0x2d, 0x63, 0xc9, + 0x58, 0x6e, 0x38, 0x6f, 0x1e, 0x1d, 0x2f, 0xce, 0x8c, 0x8f, 0x17, 0x2b, 0xbb, 0x23, 0x46, 0x9e, + 0x1d, 0x2f, 0xde, 0x38, 0x8b, 0x97, 0x76, 0xa4, 0x3c, 0x20, 0x06, 0x95, 0x9e, 0x10, 0xac, 0x55, + 0x5a, 0x32, 0x96, 0x9b, 0xab, 0x9f, 0x5a, 0xcf, 0x7d, 0x14, 0xd6, 0x1d, 0x21, 0x98, 0x33, 0x97, + 0x86, 0x96, 0x2b, 0xa4, 0xa8, 0x65, 0x88, 0x08, 0x0b, 0xde, 0x2a, 0x4f, 0x1d, 0x62, 0x1b, 0x0b, + 0x9e, 0x87, 0x90, 0x2b, 0xa4, 0xa8, 0xcd, 0x3f, 0x4b, 0xa0, 0x76, 0x3b, 0x41, 0xc3, 0x07, 0xa0, + 0x2e, 0x0f, 0xc9, 0xc3, 0x02, 0x2b, 0x3d, 0x9a, 0xab, 0xb7, 0xac, 0x44, 0x6b, 0xab, 0xa8, 0x75, + 0x1e, 0x46, 0xa2, 0xad, 0xe1, 0x8a, 0x75, 0x6f, 0xff, 0x21, 0x71, 0xc5, 0x16, 0x11, 0xd8, 0x81, + 0x3a, 0x06, 0xc8, 0x6d, 0x28, 0x63, 0x85, 0x0c, 0xcc, 0x72, 0x81, 0xc5, 0x80, 0x6b, 0xd5, 0xee, + 0x4c, 0x51, 0x92, 0xce, 0xba, 0xab, 0xf8, 0x9c, 0x6b, 0x3a, 0xee, 0x6c, 0xb2, 0x46, 0x3a, 0x0e, + 0xec, 0x81, 0x0a, 0x67, 0xc4, 0xd5, 0x12, 0x7e, 0xf1, 0x02, 0xe2, 0x31, 0xe2, 0xe6, 0x4a, 0xca, + 0x15, 0x52, 0x11, 0xcc, 0xbf, 0x0c, 0xd0, 0xd4, 0x98, 0xbb, 0x01, 0x17, 0xf0, 0xdb, 0x09, 0x35, + 0xad, 0xab, 0xa9, 0x29, 0xbd, 0x95, 0x96, 0x0b, 0x3a, 0x4a, 0x3d, 0xb5, 0x14, 0x94, 0xf4, 0x41, + 0x35, 0x10, 0x24, 0x94, 0x42, 0x96, 0x97, 0x9b, 0xab, 0xce, 0xf4, 0x85, 0x39, 0xf3, 0x3a, 0x5c, + 0x75, 0x53, 0x12, 0xa3, 0x84, 0xdf, 0xfc, 0xc9, 0x00, 0x6d, 0x8d, 0xd8, 0xa6, 0x22, 0x38, 0x08, + 0x5c, 0x2c, 0x02, 0x1a, 0x7d, 0x2d, 0x6f, 0x05, 0x89, 0xe1, 0x92, 0x6c, 0xd1, 0x30, 0xbd, 0x3f, + 0x85, 0x0e, 0x0b, 0x09, 0x52, 0x3b, 0x12, 0xc1, 0x68, 0x2c, 0xd4, 0x89, 0x17, 0x10, 0x3b, 0x34, + 0x16, 0x48, 0xed, 0xc0, 0x77, 0x41, 0x9d, 0x44, 0x1e, 0xa3, 0x41, 0x24, 0xd4, 0x39, 0x35, 0xf2, + 0xca, 0x37, 0xb4, 0x1d, 0x65, 0x08, 0xf3, 0xdf, 0x4a, 0xa6, 0xb3, 0x54, 0x1f, 0xde, 0x06, 0xc0, + 0x23, 0xac, 0x4f, 0xd5, 0x4a, 0x2b, 0xfd, 0x6a, 0x41, 0x69, 0x4b, 0x8e, 0x2b, 0xa9, 0xeb, 0x0e, + 0xf5, 0x9c, 0x6b, 0xb2, 0x35, 0xd7, 0x33, 0x38, 0x2a, 0xb8, 0x42, 0x1b, 0x34, 0x5c, 0x1a, 0x1d, + 0x04, 0x7e, 0x88, 0x99, 0xce, 0xf6, 0x25, 0x9d, 0x47, 0xe3, 0x73, 0xb5, 0xb1, 0x85, 0x19, 0xca, + 0x31, 0xb2, 0x32, 0x35, 0x3b, 0xca, 0xa7, 0x2b, 0x2b, 0xcc, 0x88, 0x35, 0x30, 0xa7, 0xe4, 0xff, + 0x8a, 0xc4, 0x3c, 0xa0, 0x51, 0xab, 0xa2, 0x90, 0x37, 0x34, 0x72, 0x6e, 0xa3, 0xb0, 0x87, 0x4e, + 0x21, 0xe1, 0x36, 0x68, 0x72, 0x12, 0x0f, 0x03, 0x97, 0xa8, 0xb2, 0xaa, 0xaa, 0xac, 0xd7, 0xcf, + 0x2b, 0xab, 0x9b, 0xc0, 0x9c, 0xeb, 0xe3, 0xe3, 0xc5, 0x66, 0x37, 0xf7, 0x41, 0x45, 0x02, 0x38, + 0x02, 0xf5, 0x47, 0xc9, 0x91, 0xf1, 0xd6, 0xac, 0x22, 0xbb, 0x37, 0xcd, 0x38, 0x99, 0xec, 0x04, + 0xee, 0xcc, 0xc9, 0x03, 0x4b, 0x57, 0x28, 0x0b, 0x07, 0x3f, 0x06, 0xf3, 0x2c, 0xa6, 0x2e, 0xe1, + 0x9c, 0xc6, 0xf2, 0xd4, 0x5b, 0x35, 0xa5, 0xc2, 0x2b, 0x5a, 0x85, 0xf9, 0x9d, 0xe2, 0x26, 0x3a, + 0x8d, 0x85, 0xbf, 0x18, 0x60, 0xc1, 0x3b, 0x33, 0x84, 0x5b, 0x75, 0x55, 0xc0, 0x97, 0x53, 0x14, + 0x70, 0x76, 0xae, 0x3b, 0x2d, 0x9d, 0xcd, 0xc4, 0x0b, 0x81, 0x26, 0xc2, 0x9b, 0x7f, 0x94, 0xc1, + 0xfc, 0xa9, 0xe9, 0x03, 0x6f, 0x81, 0x2a, 0xeb, 0x61, 0x9e, 0x5e, 0x83, 0x76, 0x7a, 0x93, 0x76, + 0xa4, 0xf1, 0xd9, 0xf1, 0x62, 0x63, 0x9b, 0x7a, 0x44, 0x2d, 0x50, 0x02, 0x84, 0xf7, 0x41, 0x83, + 0x0b, 0x1c, 0x0b, 0xe2, 0x7d, 0x26, 0xf4, 0x30, 0x7c, 0xe7, 0x6a, 0xe3, 0x61, 0x37, 0x08, 0x49, + 0xde, 0x98, 0xdd, 0x94, 0x04, 0xe5, 0x7c, 0xf0, 0x6d, 0x50, 0x0b, 0x09, 0xe7, 0xd8, 0x27, 0xba, + 0xe3, 0xae, 0x6b, 0x78, 0x6d, 0x2b, 0x31, 0xa3, 0x74, 0x1f, 0x7e, 0x0f, 0xaa, 0x11, 0xf5, 0x08, + 0x6f, 0x55, 0xd5, 0x1c, 0xe9, 0xbe, 0xa8, 0x81, 0x6c, 0xc9, 0x8a, 0xf9, 0x46, 0x24, 0xe2, 0xc2, + 0x60, 0x51, 0x36, 0x94, 0x04, 0x6c, 0x3f, 0x06, 0x20, 0xc7, 0xc0, 0x05, 0x50, 0x3e, 0x24, 0xa3, + 0x44, 0x3f, 0x24, 0x3f, 0xe1, 0x7d, 0x50, 0x1d, 0xe2, 0xfe, 0x80, 0x68, 0x75, 0x36, 0xa6, 0x6a, + 0x57, 0x8f, 0xe8, 0x77, 0x21, 0xe1, 0xfc, 0xa8, 0xb4, 0x66, 0x98, 0xcb, 0x40, 0xbd, 0xb5, 0xd9, + 0x80, 0x32, 0x2e, 0x1a, 0x50, 0xe6, 0x5b, 0x40, 0x3d, 0x99, 0xf0, 0x0d, 0x50, 0x1e, 0xc4, 0x7d, + 0x0d, 0x6c, 0x6a, 0x60, 0x79, 0x0f, 0xdd, 0x45, 0xd2, 0x6e, 0xfe, 0x5e, 0x4e, 0x4a, 0xd2, 0x4d, + 0xd1, 0x06, 0xa5, 0xc0, 0xd3, 0x60, 0xa0, 0xc1, 0xa5, 0xcd, 0x75, 0x54, 0x0a, 0xbc, 0x6c, 0x6c, + 0x96, 0x2f, 0x1c, 0x9b, 0xef, 0x83, 0xa6, 0x6c, 0xbc, 0x3e, 0x1e, 0x49, 0xa3, 0x1a, 0x00, 0x0d, + 0xe7, 0x65, 0x0d, 0x6c, 0xae, 0xe7, 0x5b, 0xa8, 0x88, 0xcb, 0x3b, 0x71, 0xf6, 0xaa, 0x9d, 0xf8, + 0xa0, 0xd8, 0x89, 0x35, 0xa5, 0xb5, 0x7d, 0xb5, 0x4e, 0xdc, 0x0a, 0xdc, 0x98, 0xfe, 0xbf, 0x76, + 0xac, 0x5f, 0xd2, 0x8e, 0x2e, 0x00, 0x03, 0xe6, 0x61, 0x41, 0x24, 0x6d, 0xab, 0xf1, 0x7c, 0xd9, + 0x64, 0xff, 0x20, 0x7b, 0x19, 0x15, 0x2a, 0xd0, 0x9a, 0xbf, 0x95, 0xc0, 0x8d, 0xf3, 0x26, 0x18, + 0xfc, 0xd1, 0x00, 0x75, 0xdd, 0x3c, 0xbc, 0x65, 0xa8, 0x0b, 0xb1, 0x37, 0xfd, 0x85, 0x38, 0x27, + 0x54, 0xfe, 0xc0, 0x69, 0x0c, 0x47, 0x59, 0x60, 0xf8, 0x18, 0xd4, 0x38, 0x89, 0x38, 0x8d, 0xd3, + 0xc7, 0x7d, 0x77, 0x8a, 0x1c, 0xba, 0x8a, 0xe9, 0xbc, 0x14, 0xb2, 0x43, 0x48, 0x20, 0x1c, 0xa5, + 0x51, 0xcd, 0x4f, 0xc0, 0x6b, 0x17, 0xba, 0x5d, 0xfe, 0xe0, 0x3b, 0xd6, 0xd1, 0x49, 0x67, 0xe6, + 0xc9, 0x49, 0x67, 0xe6, 0xe9, 0x49, 0x67, 0xe6, 0x87, 0x71, 0xc7, 0x38, 0x1a, 0x77, 0x8c, 0x27, + 0xe3, 0x8e, 0xf1, 0x74, 0xdc, 0x31, 0xfe, 0x1e, 0x77, 0x8c, 0x9f, 0xff, 0xe9, 0xcc, 0x7c, 0x53, + 0x4f, 0x53, 0xfc, 0x2f, 0x00, 0x00, 0xff, 0xff, 0xd2, 0x87, 0xd3, 0x3b, 0x10, 0x0d, 0x00, 0x00, } diff --git a/pkg/apis/gateway/v1alpha1/generated.proto b/pkg/apis/gateway/v1alpha1/generated.proto index 9e3c440eba..b422dfb450 100644 --- a/pkg/apis/gateway/v1alpha1/generated.proto +++ b/pkg/apis/gateway/v1alpha1/generated.proto @@ -23,11 +23,19 @@ import "k8s.io/api/core/v1/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; -import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v1alpha1"; +// Dispatch protocol contains configuration necessary to dispatch an event to sensor over different communication protocols +message DispatchProtocol { + optional string type = 1; + + optional Http http = 2; + + optional Nats nats = 3; +} + // Gateway is the definition of a gateway resource // +genclient // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object @@ -91,8 +99,8 @@ message GatewaySpec { // Port on which the gateway event source processor is running on. optional string processorPort = 7; - // DispatchProtocol is the underlying protocol used to send events from gateway to watchers(components interested in listening to event from this gateway) - optional string dispatchProtocol = 8; + // EventProtocol is the underlying protocol used to send events from gateway to watchers(components interested in listening to event from this gateway) + optional DispatchProtocol dispatchProtocol = 8; } // GatewayStatus contains information about the status of a gateway. @@ -111,6 +119,14 @@ message GatewayStatus { map nodes = 5; } +message Http { + optional string port = 1; +} + +message Nats { + optional string url = 1; +} + // NodeStatus describes the status for an individual node in the gateway configurations. // A single node can represent one configuration. message NodeStatus { diff --git a/pkg/apis/gateway/v1alpha1/openapi_generated.go b/pkg/apis/gateway/v1alpha1/openapi_generated.go index 5b6b439139..f623556226 100644 --- a/pkg/apis/gateway/v1alpha1/openapi_generated.go +++ b/pkg/apis/gateway/v1alpha1/openapi_generated.go @@ -28,22 +28,58 @@ import ( func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenAPIDefinition { return map[string]common.OpenAPIDefinition{ + "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.DispatchProtocol": schema_pkg_apis_gateway_v1alpha1_DispatchProtocol(ref), "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.Gateway": schema_pkg_apis_gateway_v1alpha1_Gateway(ref), "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.GatewayList": schema_pkg_apis_gateway_v1alpha1_GatewayList(ref), "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.GatewayNotificationWatcher": schema_pkg_apis_gateway_v1alpha1_GatewayNotificationWatcher(ref), "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.GatewaySpec": schema_pkg_apis_gateway_v1alpha1_GatewaySpec(ref), "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.GatewayStatus": schema_pkg_apis_gateway_v1alpha1_GatewayStatus(ref), + "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.Http": schema_pkg_apis_gateway_v1alpha1_Http(ref), + "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.Nats": schema_pkg_apis_gateway_v1alpha1_Nats(ref), "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.NodeStatus": schema_pkg_apis_gateway_v1alpha1_NodeStatus(ref), "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.NotificationWatchers": schema_pkg_apis_gateway_v1alpha1_NotificationWatchers(ref), "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.SensorNotificationWatcher": schema_pkg_apis_gateway_v1alpha1_SensorNotificationWatcher(ref), } } +func schema_pkg_apis_gateway_v1alpha1_DispatchProtocol(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "Dispatch protocol contains configuration necessary to dispatch an event to sensor over different communication protocols", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "type": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + "http": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.Http"), + }, + }, + "nats": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.Nats"), + }, + }, + }, + Required: []string{"type", "http", "nats"}, + }, + }, + Dependencies: []string{ + "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.Http", "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.Nats"}, + } +} + func schema_pkg_apis_gateway_v1alpha1_Gateway(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "Gateway is the definition of a gateway resource", + Type: []string{"object"}, Properties: map[string]spec.Schema{ "status": { SchemaProps: spec.SchemaProps{ @@ -69,6 +105,7 @@ func schema_pkg_apis_gateway_v1alpha1_GatewayList(ref common.ReferenceCallback) Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "GatewayList is the list of Gateway resources", + Type: []string{"object"}, Properties: map[string]spec.Schema{ "items": { SchemaProps: spec.SchemaProps{ @@ -96,6 +133,7 @@ func schema_pkg_apis_gateway_v1alpha1_GatewayNotificationWatcher(ref common.Refe Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "GatewayNotificationWatcher is the gateway interested in listening to notifications from this gateway", + Type: []string{"object"}, Properties: map[string]spec.Schema{ "name": { SchemaProps: spec.SchemaProps{ @@ -131,6 +169,7 @@ func schema_pkg_apis_gateway_v1alpha1_GatewaySpec(ref common.ReferenceCallback) Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "GatewaySpec represents gateway specifications", + Type: []string{"object"}, Properties: map[string]spec.Schema{ "deploySpec": { SchemaProps: spec.SchemaProps{ @@ -180,9 +219,8 @@ func schema_pkg_apis_gateway_v1alpha1_GatewaySpec(ref common.ReferenceCallback) }, "dispatchProtocol": { SchemaProps: spec.SchemaProps{ - Description: "DispatchProtocol is the underlying protocol used to send events from gateway to watchers(components interested in listening to event from this gateway)", - Type: []string{"string"}, - Format: "", + Description: "EventProtocol is the underlying protocol used to send events from gateway to watchers(components interested in listening to event from this gateway)", + Ref: ref("github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.DispatchProtocol"), }, }, }, @@ -190,7 +228,7 @@ func schema_pkg_apis_gateway_v1alpha1_GatewaySpec(ref common.ReferenceCallback) }, }, Dependencies: []string{ - "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.NotificationWatchers", "k8s.io/api/core/v1.Pod", "k8s.io/api/core/v1.Service"}, + "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.DispatchProtocol", "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.NotificationWatchers", "k8s.io/api/core/v1.Pod", "k8s.io/api/core/v1.Service"}, } } @@ -199,6 +237,7 @@ func schema_pkg_apis_gateway_v1alpha1_GatewayStatus(ref common.ReferenceCallback Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "GatewayStatus contains information about the status of a gateway.", + Type: []string{"object"}, Properties: map[string]spec.Schema{ "phase": { SchemaProps: spec.SchemaProps{ @@ -242,11 +281,52 @@ func schema_pkg_apis_gateway_v1alpha1_GatewayStatus(ref common.ReferenceCallback } } +func schema_pkg_apis_gateway_v1alpha1_Http(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "port": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + }, + Required: []string{"port"}, + }, + }, + Dependencies: []string{}, + } +} + +func schema_pkg_apis_gateway_v1alpha1_Nats(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "url": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + }, + Required: []string{"url"}, + }, + }, + Dependencies: []string{}, + } +} + func schema_pkg_apis_gateway_v1alpha1_NodeStatus(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "NodeStatus describes the status for an individual node in the gateway configurations. A single node can represent one configuration.", + Type: []string{"object"}, Properties: map[string]spec.Schema{ "id": { SchemaProps: spec.SchemaProps{ @@ -296,6 +376,7 @@ func schema_pkg_apis_gateway_v1alpha1_NotificationWatchers(ref common.ReferenceC Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "NotificationWatchers are components which are interested listening to notifications from this gateway", + Type: []string{"object"}, Properties: map[string]spec.Schema{ "gateways": { SchemaProps: spec.SchemaProps{ @@ -336,6 +417,7 @@ func schema_pkg_apis_gateway_v1alpha1_SensorNotificationWatcher(ref common.Refer Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "SensorNotificationWatcher is the sensor interested in listening to notifications from this gateway", + Type: []string{"object"}, Properties: map[string]spec.Schema{ "name": { SchemaProps: spec.SchemaProps{ diff --git a/pkg/apis/gateway/v1alpha1/types.go b/pkg/apis/gateway/v1alpha1/types.go index 615a1cb9be..d5c3540287 100644 --- a/pkg/apis/gateway/v1alpha1/types.go +++ b/pkg/apis/gateway/v1alpha1/types.go @@ -39,9 +39,8 @@ type DispatchProtocolType string // possible types of event dispatch protocol const ( - HTTPGateway DispatchProtocolType = "HTTP" - NATSGateway DispatchProtocolType = "NATS" - KafkaGateway DispatchProtocolType = "KAFKA" + HTTPGateway DispatchProtocolType = "HTTP" + NATSGateway DispatchProtocolType = "NATS" ) // Gateway is the definition of a gateway resource @@ -95,8 +94,8 @@ type GatewaySpec struct { // Port on which the gateway event source processor is running on. ProcessorPort string `json:"processorPort" protobuf:"bytes,7,opt,name=processorPort"` - // DispatchProtocol is the underlying protocol used to send events from gateway to watchers(components interested in listening to event from this gateway) - DispatchProtocol DispatchProtocolType `json:"dispatchProtocol" protobuf:"bytes,8,opt,name=dispatchProtocol"` + // EventProtocol is the underlying protocol used to send events from gateway to watchers(components interested in listening to event from this gateway) + DispatchProtocol DispatchProtocol `json:"dispatchProtocol" protobuf:"bytes,8,opt,name=dispatchProtocol"` } // GatewayStatus contains information about the status of a gateway. @@ -173,7 +172,7 @@ type SensorNotificationWatcher struct { // Dispatch protocol contains configuration necessary to dispatch an event to sensor over different communication protocols type DispatchProtocol struct { - Type string `json:"type" protobuf:"bytes,1,opt,name=type"` + Type DispatchProtocolType `json:"type" protobuf:"bytes,1,opt,name=type"` Http Http `json:"http" protobuf:"bytes,2,opt,name=http"` @@ -185,5 +184,5 @@ type Http struct { } type Nats struct { - Nats string `json:"nats" protobuf:"bytes,1,opt,name=nats"` + URL string `json:"url" protobuf:"bytes,1,opt,name=url"` } diff --git a/pkg/apis/gateway/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/gateway/v1alpha1/zz_generated.deepcopy.go index 7b6caa1cad..529f3efe0d 100644 --- a/pkg/apis/gateway/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/gateway/v1alpha1/zz_generated.deepcopy.go @@ -24,6 +24,24 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" ) +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DispatchProtocol) DeepCopyInto(out *DispatchProtocol) { + *out = *in + out.Http = in.Http + out.Nats = in.Nats + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DispatchProtocol. +func (in *DispatchProtocol) DeepCopy() *DispatchProtocol { + if in == nil { + return nil + } + out := new(DispatchProtocol) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Gateway) DeepCopyInto(out *Gateway) { *out = *in @@ -119,6 +137,7 @@ func (in *GatewaySpec) DeepCopyInto(out *GatewaySpec) { *out = new(NotificationWatchers) (*in).DeepCopyInto(*out) } + out.DispatchProtocol = in.DispatchProtocol return } @@ -156,6 +175,38 @@ func (in *GatewayStatus) DeepCopy() *GatewayStatus { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Http) DeepCopyInto(out *Http) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Http. +func (in *Http) DeepCopy() *Http { + if in == nil { + return nil + } + out := new(Http) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Nats) DeepCopyInto(out *Nats) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Nats. +func (in *Nats) DeepCopy() *Nats { + if in == nil { + return nil + } + out := new(Nats) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *NodeStatus) DeepCopyInto(out *NodeStatus) { *out = *in diff --git a/pkg/apis/sensor/v1alpha1/generated.pb.go b/pkg/apis/sensor/v1alpha1/generated.pb.go index 3fdb4c3a83..a54e605220 100644 --- a/pkg/apis/sensor/v1alpha1/generated.pb.go +++ b/pkg/apis/sensor/v1alpha1/generated.pb.go @@ -46,7 +46,7 @@ const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package func (m *ArtifactLocation) Reset() { *m = ArtifactLocation{} } func (*ArtifactLocation) ProtoMessage() {} func (*ArtifactLocation) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_579de10a8af1592d, []int{0} + return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{0} } func (m *ArtifactLocation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -74,7 +74,7 @@ var xxx_messageInfo_ArtifactLocation proto.InternalMessageInfo func (m *ConfigmapArtifact) Reset() { *m = ConfigmapArtifact{} } func (*ConfigmapArtifact) ProtoMessage() {} func (*ConfigmapArtifact) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_579de10a8af1592d, []int{1} + return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{1} } func (m *ConfigmapArtifact) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -102,7 +102,7 @@ var xxx_messageInfo_ConfigmapArtifact proto.InternalMessageInfo func (m *Data) Reset() { *m = Data{} } func (*Data) ProtoMessage() {} func (*Data) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_579de10a8af1592d, []int{2} + return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{2} } func (m *Data) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -130,7 +130,7 @@ var xxx_messageInfo_Data proto.InternalMessageInfo func (m *DataFilter) Reset() { *m = DataFilter{} } func (*DataFilter) ProtoMessage() {} func (*DataFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_579de10a8af1592d, []int{3} + return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{3} } func (m *DataFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -158,7 +158,7 @@ var xxx_messageInfo_DataFilter proto.InternalMessageInfo func (m *EscalationPolicy) Reset() { *m = EscalationPolicy{} } func (*EscalationPolicy) ProtoMessage() {} func (*EscalationPolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_579de10a8af1592d, []int{4} + return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{4} } func (m *EscalationPolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -186,7 +186,7 @@ var xxx_messageInfo_EscalationPolicy proto.InternalMessageInfo func (m *Event) Reset() { *m = Event{} } func (*Event) ProtoMessage() {} func (*Event) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_579de10a8af1592d, []int{5} + return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{5} } func (m *Event) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -214,7 +214,7 @@ var xxx_messageInfo_Event proto.InternalMessageInfo func (m *EventContext) Reset() { *m = EventContext{} } func (*EventContext) ProtoMessage() {} func (*EventContext) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_579de10a8af1592d, []int{6} + return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{6} } func (m *EventContext) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -242,7 +242,7 @@ var xxx_messageInfo_EventContext proto.InternalMessageInfo func (m *EventDependency) Reset() { *m = EventDependency{} } func (*EventDependency) ProtoMessage() {} func (*EventDependency) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_579de10a8af1592d, []int{7} + return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{7} } func (m *EventDependency) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -270,7 +270,7 @@ var xxx_messageInfo_EventDependency proto.InternalMessageInfo func (m *EventDependencyFilter) Reset() { *m = EventDependencyFilter{} } func (*EventDependencyFilter) ProtoMessage() {} func (*EventDependencyFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_579de10a8af1592d, []int{8} + return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{8} } func (m *EventDependencyFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -295,10 +295,38 @@ func (m *EventDependencyFilter) XXX_DiscardUnknown() { var xxx_messageInfo_EventDependencyFilter proto.InternalMessageInfo +func (m *EventProtocol) Reset() { *m = EventProtocol{} } +func (*EventProtocol) ProtoMessage() {} +func (*EventProtocol) Descriptor() ([]byte, []int) { + return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{9} +} +func (m *EventProtocol) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EventProtocol) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (dst *EventProtocol) XXX_Merge(src proto.Message) { + xxx_messageInfo_EventProtocol.Merge(dst, src) +} +func (m *EventProtocol) XXX_Size() int { + return m.Size() +} +func (m *EventProtocol) XXX_DiscardUnknown() { + xxx_messageInfo_EventProtocol.DiscardUnknown(m) +} + +var xxx_messageInfo_EventProtocol proto.InternalMessageInfo + func (m *FileArtifact) Reset() { *m = FileArtifact{} } func (*FileArtifact) ProtoMessage() {} func (*FileArtifact) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_579de10a8af1592d, []int{9} + return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{10} } func (m *FileArtifact) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -326,7 +354,7 @@ var xxx_messageInfo_FileArtifact proto.InternalMessageInfo func (m *GroupVersionKind) Reset() { *m = GroupVersionKind{} } func (*GroupVersionKind) ProtoMessage() {} func (*GroupVersionKind) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_579de10a8af1592d, []int{10} + return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{11} } func (m *GroupVersionKind) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -351,10 +379,66 @@ func (m *GroupVersionKind) XXX_DiscardUnknown() { var xxx_messageInfo_GroupVersionKind proto.InternalMessageInfo +func (m *Http) Reset() { *m = Http{} } +func (*Http) ProtoMessage() {} +func (*Http) Descriptor() ([]byte, []int) { + return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{12} +} +func (m *Http) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Http) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (dst *Http) XXX_Merge(src proto.Message) { + xxx_messageInfo_Http.Merge(dst, src) +} +func (m *Http) XXX_Size() int { + return m.Size() +} +func (m *Http) XXX_DiscardUnknown() { + xxx_messageInfo_Http.DiscardUnknown(m) +} + +var xxx_messageInfo_Http proto.InternalMessageInfo + +func (m *Nats) Reset() { *m = Nats{} } +func (*Nats) ProtoMessage() {} +func (*Nats) Descriptor() ([]byte, []int) { + return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{13} +} +func (m *Nats) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Nats) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (dst *Nats) XXX_Merge(src proto.Message) { + xxx_messageInfo_Nats.Merge(dst, src) +} +func (m *Nats) XXX_Size() int { + return m.Size() +} +func (m *Nats) XXX_DiscardUnknown() { + xxx_messageInfo_Nats.DiscardUnknown(m) +} + +var xxx_messageInfo_Nats proto.InternalMessageInfo + func (m *NodeStatus) Reset() { *m = NodeStatus{} } func (*NodeStatus) ProtoMessage() {} func (*NodeStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_579de10a8af1592d, []int{11} + return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{14} } func (m *NodeStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -382,7 +466,7 @@ var xxx_messageInfo_NodeStatus proto.InternalMessageInfo func (m *ResourceObject) Reset() { *m = ResourceObject{} } func (*ResourceObject) ProtoMessage() {} func (*ResourceObject) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_579de10a8af1592d, []int{12} + return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{15} } func (m *ResourceObject) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -410,7 +494,7 @@ var xxx_messageInfo_ResourceObject proto.InternalMessageInfo func (m *ResourceParameter) Reset() { *m = ResourceParameter{} } func (*ResourceParameter) ProtoMessage() {} func (*ResourceParameter) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_579de10a8af1592d, []int{13} + return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{16} } func (m *ResourceParameter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -438,7 +522,7 @@ var xxx_messageInfo_ResourceParameter proto.InternalMessageInfo func (m *ResourceParameterSource) Reset() { *m = ResourceParameterSource{} } func (*ResourceParameterSource) ProtoMessage() {} func (*ResourceParameterSource) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_579de10a8af1592d, []int{14} + return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{17} } func (m *ResourceParameterSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -466,7 +550,7 @@ var xxx_messageInfo_ResourceParameterSource proto.InternalMessageInfo func (m *RetryStrategy) Reset() { *m = RetryStrategy{} } func (*RetryStrategy) ProtoMessage() {} func (*RetryStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_579de10a8af1592d, []int{15} + return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{18} } func (m *RetryStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -494,7 +578,7 @@ var xxx_messageInfo_RetryStrategy proto.InternalMessageInfo func (m *S3Artifact) Reset() { *m = S3Artifact{} } func (*S3Artifact) ProtoMessage() {} func (*S3Artifact) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_579de10a8af1592d, []int{16} + return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{19} } func (m *S3Artifact) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -522,7 +606,7 @@ var xxx_messageInfo_S3Artifact proto.InternalMessageInfo func (m *S3Bucket) Reset() { *m = S3Bucket{} } func (*S3Bucket) ProtoMessage() {} func (*S3Bucket) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_579de10a8af1592d, []int{17} + return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{20} } func (m *S3Bucket) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -550,7 +634,7 @@ var xxx_messageInfo_S3Bucket proto.InternalMessageInfo func (m *S3Filter) Reset() { *m = S3Filter{} } func (*S3Filter) ProtoMessage() {} func (*S3Filter) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_579de10a8af1592d, []int{18} + return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{21} } func (m *S3Filter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -578,7 +662,7 @@ var xxx_messageInfo_S3Filter proto.InternalMessageInfo func (m *Sensor) Reset() { *m = Sensor{} } func (*Sensor) ProtoMessage() {} func (*Sensor) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_579de10a8af1592d, []int{19} + return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{22} } func (m *Sensor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -606,7 +690,7 @@ var xxx_messageInfo_Sensor proto.InternalMessageInfo func (m *SensorList) Reset() { *m = SensorList{} } func (*SensorList) ProtoMessage() {} func (*SensorList) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_579de10a8af1592d, []int{20} + return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{23} } func (m *SensorList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -634,7 +718,7 @@ var xxx_messageInfo_SensorList proto.InternalMessageInfo func (m *SensorSpec) Reset() { *m = SensorSpec{} } func (*SensorSpec) ProtoMessage() {} func (*SensorSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_579de10a8af1592d, []int{21} + return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{24} } func (m *SensorSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -662,7 +746,7 @@ var xxx_messageInfo_SensorSpec proto.InternalMessageInfo func (m *SensorStatus) Reset() { *m = SensorStatus{} } func (*SensorStatus) ProtoMessage() {} func (*SensorStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_579de10a8af1592d, []int{22} + return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{25} } func (m *SensorStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -690,7 +774,7 @@ var xxx_messageInfo_SensorStatus proto.InternalMessageInfo func (m *TimeFilter) Reset() { *m = TimeFilter{} } func (*TimeFilter) ProtoMessage() {} func (*TimeFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_579de10a8af1592d, []int{23} + return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{26} } func (m *TimeFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -718,7 +802,7 @@ var xxx_messageInfo_TimeFilter proto.InternalMessageInfo func (m *Trigger) Reset() { *m = Trigger{} } func (*Trigger) ProtoMessage() {} func (*Trigger) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_579de10a8af1592d, []int{24} + return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{27} } func (m *Trigger) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -746,7 +830,7 @@ var xxx_messageInfo_Trigger proto.InternalMessageInfo func (m *URI) Reset() { *m = URI{} } func (*URI) ProtoMessage() {} func (*URI) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_579de10a8af1592d, []int{25} + return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{28} } func (m *URI) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -774,7 +858,7 @@ var xxx_messageInfo_URI proto.InternalMessageInfo func (m *URLArtifact) Reset() { *m = URLArtifact{} } func (*URLArtifact) ProtoMessage() {} func (*URLArtifact) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_579de10a8af1592d, []int{26} + return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{29} } func (m *URLArtifact) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -810,8 +894,11 @@ func init() { proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.EventContext.ExtensionsEntry") proto.RegisterType((*EventDependency)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.EventDependency") proto.RegisterType((*EventDependencyFilter)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.EventDependencyFilter") + proto.RegisterType((*EventProtocol)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.EventProtocol") proto.RegisterType((*FileArtifact)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.FileArtifact") proto.RegisterType((*GroupVersionKind)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.GroupVersionKind") + proto.RegisterType((*Http)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.Http") + proto.RegisterType((*Nats)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.Nats") proto.RegisterType((*NodeStatus)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.NodeStatus") proto.RegisterType((*ResourceObject)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.ResourceObject") proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.ResourceObject.LabelsEntry") @@ -1250,6 +1337,44 @@ func (m *EventDependencyFilter) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *EventProtocol) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EventProtocol) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Type))) + i += copy(dAtA[i:], m.Type) + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Http.Size())) + n16, err := m.Http.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n16 + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Nats.Size())) + n17, err := m.Nats.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n17 + return i, nil +} + func (m *FileArtifact) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1302,6 +1427,98 @@ func (m *GroupVersionKind) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *Http) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Http) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Port))) + i += copy(dAtA[i:], m.Port) + return i, nil +} + +func (m *Nats) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Nats) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.URL))) + i += copy(dAtA[i:], m.URL) + dAtA[i] = 0x10 + i++ + if m.StartWithLastReceived { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + dAtA[i] = 0x18 + i++ + if m.DeliverAllAvailable { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.StartAtSequence))) + i += copy(dAtA[i:], m.StartAtSequence) + dAtA[i] = 0x2a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.StartAtTime))) + i += copy(dAtA[i:], m.StartAtTime) + dAtA[i] = 0x32 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.StartAtTimeDelta))) + i += copy(dAtA[i:], m.StartAtTimeDelta) + dAtA[i] = 0x38 + i++ + if m.Durable { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + dAtA[i] = 0x42 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ClusterId))) + i += copy(dAtA[i:], m.ClusterId) + dAtA[i] = 0x4a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ClientId))) + i += copy(dAtA[i:], m.ClientId) + dAtA[i] = 0x52 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Type))) + i += copy(dAtA[i:], m.Type) + return i, nil +} + func (m *NodeStatus) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1340,19 +1557,19 @@ func (m *NodeStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x32 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StartedAt.Size())) - n16, err := m.StartedAt.MarshalTo(dAtA[i:]) + n18, err := m.StartedAt.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n16 + i += n18 dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.CompletedAt.Size())) - n17, err := m.CompletedAt.MarshalTo(dAtA[i:]) + n19, err := m.CompletedAt.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n17 + i += n19 dAtA[i] = 0x42 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Message))) @@ -1361,11 +1578,11 @@ func (m *NodeStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x4a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Event.Size())) - n18, err := m.Event.MarshalTo(dAtA[i:]) + n20, err := m.Event.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n18 + i += n20 } return i, nil } @@ -1426,19 +1643,19 @@ func (m *ResourceObject) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.GroupVersionKind.Size())) - n19, err := m.GroupVersionKind.MarshalTo(dAtA[i:]) + n21, err := m.GroupVersionKind.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n19 + i += n21 dAtA[i] = 0x32 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Source.Size())) - n20, err := m.Source.MarshalTo(dAtA[i:]) + n22, err := m.Source.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n20 + i += n22 return i, nil } @@ -1461,11 +1678,11 @@ func (m *ResourceParameter) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Src.Size())) - n21, err := m.Src.MarshalTo(dAtA[i:]) + n23, err := m.Src.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n21 + i += n23 } dAtA[i] = 0x12 i++ @@ -1551,21 +1768,21 @@ func (m *S3Artifact) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Filter.Size())) - n22, err := m.Filter.MarshalTo(dAtA[i:]) + n24, err := m.Filter.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n22 + i += n24 } if m.S3Bucket != nil { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.S3Bucket.Size())) - n23, err := m.S3Bucket.MarshalTo(dAtA[i:]) + n25, err := m.S3Bucket.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n23 + i += n25 } return i, nil } @@ -1609,21 +1826,21 @@ func (m *S3Bucket) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AccessKey.Size())) - n24, err := m.AccessKey.MarshalTo(dAtA[i:]) + n26, err := m.AccessKey.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n24 + i += n26 } if m.SecretKey != nil { dAtA[i] = 0x32 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretKey.Size())) - n25, err := m.SecretKey.MarshalTo(dAtA[i:]) + n27, err := m.SecretKey.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n25 + i += n27 } return i, nil } @@ -1672,27 +1889,27 @@ func (m *Sensor) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n26, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n28, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n26 + i += n28 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n27, err := m.Spec.MarshalTo(dAtA[i:]) + n29, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n27 + i += n29 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n28, err := m.Status.MarshalTo(dAtA[i:]) + n30, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n28 + i += n30 return i, nil } @@ -1714,11 +1931,11 @@ func (m *SensorList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n29, err := m.ListMeta.MarshalTo(dAtA[i:]) + n31, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n29 + i += n31 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -1749,8 +1966,8 @@ func (m *SensorSpec) MarshalTo(dAtA []byte) (int, error) { _ = i var l int _ = l - if len(m.EventDependencies) > 0 { - for _, msg := range m.EventDependencies { + if len(m.Dependencies) > 0 { + for _, msg := range m.Dependencies { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) @@ -1777,11 +1994,21 @@ func (m *SensorSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.DeploySpec.Size())) - n30, err := m.DeploySpec.MarshalTo(dAtA[i:]) + n32, err := m.DeploySpec.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n32 + } + if m.EventProtocol != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.EventProtocol.Size())) + n33, err := m.EventProtocol.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n30 + i += n33 } return i, nil } @@ -1808,19 +2035,19 @@ func (m *SensorStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StartedAt.Size())) - n31, err := m.StartedAt.MarshalTo(dAtA[i:]) + n34, err := m.StartedAt.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n31 + i += n34 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.CompletedAt.Size())) - n32, err := m.CompletedAt.MarshalTo(dAtA[i:]) + n35, err := m.CompletedAt.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n32 + i += n35 dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Message))) @@ -1849,11 +2076,11 @@ func (m *SensorStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n33, err := (&v).MarshalTo(dAtA[i:]) + n36, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n33 + i += n36 } } dAtA[i] = 0x30 @@ -1889,11 +2116,11 @@ func (m *TimeFilter) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.EscalationPolicy.Size())) - n34, err := m.EscalationPolicy.MarshalTo(dAtA[i:]) + n37, err := m.EscalationPolicy.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n34 + i += n37 } return i, nil } @@ -1921,11 +2148,11 @@ func (m *Trigger) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Resource.Size())) - n35, err := m.Resource.MarshalTo(dAtA[i:]) + n38, err := m.Resource.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n35 + i += n38 } dAtA[i] = 0x1a i++ @@ -1935,11 +2162,11 @@ func (m *Trigger) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.RetryStrategy.Size())) - n36, err := m.RetryStrategy.MarshalTo(dAtA[i:]) + n39, err := m.RetryStrategy.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n36 + i += n39 } return i, nil } @@ -2222,6 +2449,21 @@ func (m *EventDependencyFilter) Size() (n int) { return n } +func (m *EventProtocol) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Type) + n += 1 + l + sovGenerated(uint64(l)) + l = m.Http.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.Nats.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *FileArtifact) Size() (n int) { if m == nil { return 0 @@ -2248,6 +2490,43 @@ func (m *GroupVersionKind) Size() (n int) { return n } +func (m *Http) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Port) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *Nats) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.URL) + n += 1 + l + sovGenerated(uint64(l)) + n += 2 + n += 2 + l = len(m.StartAtSequence) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.StartAtTime) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.StartAtTimeDelta) + n += 1 + l + sovGenerated(uint64(l)) + n += 2 + l = len(m.ClusterId) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.ClientId) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Type) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *NodeStatus) Size() (n int) { if m == nil { return 0 @@ -2443,8 +2722,8 @@ func (m *SensorSpec) Size() (n int) { } var l int _ = l - if len(m.EventDependencies) > 0 { - for _, e := range m.EventDependencies { + if len(m.Dependencies) > 0 { + for _, e := range m.Dependencies { l = e.Size() n += 1 + l + sovGenerated(uint64(l)) } @@ -2459,6 +2738,10 @@ func (m *SensorSpec) Size() (n int) { l = m.DeploySpec.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.EventProtocol != nil { + l = m.EventProtocol.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -2703,6 +2986,18 @@ func (this *EventDependencyFilter) String() string { }, "") return s } +func (this *EventProtocol) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&EventProtocol{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `Http:` + strings.Replace(strings.Replace(this.Http.String(), "Http", "Http", 1), `&`, ``, 1) + `,`, + `Nats:` + strings.Replace(strings.Replace(this.Nats.String(), "Nats", "Nats", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} func (this *FileArtifact) String() string { if this == nil { return "nil" @@ -2725,6 +3020,35 @@ func (this *GroupVersionKind) String() string { }, "") return s } +func (this *Http) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Http{`, + `Port:` + fmt.Sprintf("%v", this.Port) + `,`, + `}`, + }, "") + return s +} +func (this *Nats) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Nats{`, + `URL:` + fmt.Sprintf("%v", this.URL) + `,`, + `StartWithLastReceived:` + fmt.Sprintf("%v", this.StartWithLastReceived) + `,`, + `DeliverAllAvailable:` + fmt.Sprintf("%v", this.DeliverAllAvailable) + `,`, + `StartAtSequence:` + fmt.Sprintf("%v", this.StartAtSequence) + `,`, + `StartAtTime:` + fmt.Sprintf("%v", this.StartAtTime) + `,`, + `StartAtTimeDelta:` + fmt.Sprintf("%v", this.StartAtTimeDelta) + `,`, + `Durable:` + fmt.Sprintf("%v", this.Durable) + `,`, + `ClusterId:` + fmt.Sprintf("%v", this.ClusterId) + `,`, + `ClientId:` + fmt.Sprintf("%v", this.ClientId) + `,`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `}`, + }, "") + return s +} func (this *NodeStatus) String() string { if this == nil { return "nil" @@ -2866,9 +3190,10 @@ func (this *SensorSpec) String() string { return "nil" } s := strings.Join([]string{`&SensorSpec{`, - `EventDependencies:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.EventDependencies), "EventDependency", "EventDependency", 1), `&`, ``, 1) + `,`, + `Dependencies:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Dependencies), "EventDependency", "EventDependency", 1), `&`, ``, 1) + `,`, `Triggers:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Triggers), "Trigger", "Trigger", 1), `&`, ``, 1) + `,`, `DeploySpec:` + strings.Replace(fmt.Sprintf("%v", this.DeploySpec), "PodSpec", "v11.PodSpec", 1) + `,`, + `EventProtocol:` + strings.Replace(fmt.Sprintf("%v", this.EventProtocol), "EventProtocol", "EventProtocol", 1) + `,`, `}`, }, "") return s @@ -4588,7 +4913,7 @@ func (m *EventDependencyFilter) Unmarshal(dAtA []byte) error { } return nil } -func (m *FileArtifact) Unmarshal(dAtA []byte) error { +func (m *EventProtocol) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -4611,15 +4936,15 @@ func (m *FileArtifact) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: FileArtifact: wiretype end group for non-group") + return fmt.Errorf("proto: EventProtocol: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: FileArtifact: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: EventProtocol: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -4644,22 +4969,377 @@ func (m *FileArtifact) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Path = string(dAtA[iNdEx:postIndex]) + m.Type = EventProtocolType(dAtA[iNdEx:postIndex]) iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Http", wireType) } - iNdEx += skippy - } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Http.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Nats", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Nats.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *FileArtifact) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: FileArtifact: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: FileArtifact: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Path = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GroupVersionKind) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: GroupVersionKind: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GroupVersionKind: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Group", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Group = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Version = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Kind = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Http) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Http: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Http: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Port", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Port = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } } if iNdEx > l { @@ -4667,7 +5347,7 @@ func (m *FileArtifact) Unmarshal(dAtA []byte) error { } return nil } -func (m *GroupVersionKind) Unmarshal(dAtA []byte) error { +func (m *Nats) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -4690,15 +5370,15 @@ func (m *GroupVersionKind) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GroupVersionKind: wiretype end group for non-group") + return fmt.Errorf("proto: Nats: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GroupVersionKind: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Nats: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Group", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field URL", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -4723,11 +5403,51 @@ func (m *GroupVersionKind) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Group = string(dAtA[iNdEx:postIndex]) + m.URL = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field StartWithLastReceived", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.StartWithLastReceived = bool(v != 0) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DeliverAllAvailable", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.DeliverAllAvailable = bool(v != 0) + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field StartAtSequence", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -4752,11 +5472,11 @@ func (m *GroupVersionKind) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Version = string(dAtA[iNdEx:postIndex]) + m.StartAtSequence = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field StartAtTime", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -4781,7 +5501,143 @@ func (m *GroupVersionKind) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Kind = string(dAtA[iNdEx:postIndex]) + m.StartAtTime = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StartAtTimeDelta", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.StartAtTimeDelta = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Durable", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Durable = bool(v != 0) + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClusterId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClusterId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClientId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClientId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Type = NatsType(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -6496,7 +7352,7 @@ func (m *SensorSpec) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EventDependencies", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Dependencies", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -6520,8 +7376,8 @@ func (m *SensorSpec) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.EventDependencies = append(m.EventDependencies, EventDependency{}) - if err := m.EventDependencies[len(m.EventDependencies)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Dependencies = append(m.Dependencies, EventDependency{}) + if err := m.Dependencies[len(m.Dependencies)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -6589,6 +7445,39 @@ func (m *SensorSpec) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EventProtocol", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.EventProtocol == nil { + m.EventProtocol = &EventProtocol{} + } + if err := m.EventProtocol.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -7712,158 +8601,176 @@ var ( ) func init() { - proto.RegisterFile("github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1/generated.proto", fileDescriptor_generated_579de10a8af1592d) -} - -var fileDescriptor_generated_579de10a8af1592d = []byte{ - // 2381 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x59, 0xcf, 0x6f, 0x1c, 0x49, - 0xf5, 0x4f, 0xcf, 0x2f, 0xcf, 0xbc, 0x71, 0xd6, 0x4e, 0x7d, 0xf7, 0xab, 0x1d, 0x8c, 0xf0, 0x44, - 0xbd, 0x62, 0xb5, 0xa0, 0xdd, 0x99, 0x24, 0x66, 0x57, 0x01, 0x69, 0x61, 0x33, 0xb6, 0xb3, 0x71, - 0xec, 0x24, 0x4e, 0xcd, 0x26, 0x87, 0xb0, 0x12, 0x69, 0x77, 0xd7, 0x8c, 0x3b, 0xee, 0xe9, 0xee, - 0xad, 0xaa, 0x31, 0x19, 0x84, 0x60, 0x59, 0x81, 0x84, 0x10, 0x87, 0xdc, 0x38, 0x70, 0xe4, 0x7f, - 0xe0, 0x8a, 0x84, 0x38, 0xe4, 0x82, 0xb4, 0x1c, 0x40, 0xcb, 0x81, 0x11, 0x19, 0x24, 0x0e, 0xfc, - 0x09, 0x39, 0xa1, 0xfa, 0xd1, 0xd5, 0x3d, 0x6d, 0x9b, 0x4c, 0x3c, 0x96, 0x72, 0x49, 0x7a, 0xde, - 0x7b, 0xf5, 0x79, 0xaf, 0x5e, 0x55, 0xbd, 0xf7, 0xa9, 0x32, 0xdc, 0xe8, 0xfb, 0x7c, 0x7f, 0xb8, - 0xd7, 0x72, 0xa3, 0x41, 0xdb, 0xa1, 0xfd, 0x28, 0xa6, 0xd1, 0x23, 0xf9, 0xf1, 0x2e, 0x39, 0x24, - 0x21, 0x67, 0xed, 0xf8, 0xa0, 0xdf, 0x76, 0x62, 0x9f, 0xb5, 0x19, 0x09, 0x59, 0x44, 0xdb, 0x87, - 0x97, 0x9d, 0x20, 0xde, 0x77, 0x2e, 0xb7, 0xfb, 0x24, 0x24, 0xd4, 0xe1, 0xc4, 0x6b, 0xc5, 0x34, - 0xe2, 0x11, 0xba, 0x9a, 0x22, 0xb5, 0x12, 0x24, 0xf9, 0xf1, 0x03, 0x85, 0xd4, 0x8a, 0x0f, 0xfa, - 0x2d, 0x81, 0xd4, 0x52, 0x48, 0xad, 0x04, 0x69, 0xe5, 0xdd, 0x4c, 0x0c, 0xfd, 0xa8, 0x1f, 0xb5, - 0x25, 0xe0, 0xde, 0xb0, 0x27, 0x7f, 0xc9, 0x1f, 0xf2, 0x4b, 0x39, 0x5a, 0xb1, 0x0f, 0xae, 0xb2, - 0x96, 0x1f, 0x89, 0xa8, 0xda, 0x6e, 0x44, 0x49, 0xfb, 0xf0, 0x48, 0x30, 0x2b, 0xdf, 0x4a, 0x6d, - 0x06, 0x8e, 0xbb, 0xef, 0x87, 0x84, 0x8e, 0xd2, 0xa9, 0x0c, 0x08, 0x77, 0x8e, 0x1b, 0xd5, 0x3e, - 0x69, 0x14, 0x1d, 0x86, 0xdc, 0x1f, 0x90, 0x23, 0x03, 0xde, 0x7f, 0xd1, 0x00, 0xe6, 0xee, 0x93, - 0x81, 0x73, 0x64, 0xdc, 0xda, 0x49, 0xe3, 0x86, 0xdc, 0x0f, 0xda, 0x7e, 0xc8, 0x19, 0xa7, 0xf9, - 0x41, 0xf6, 0xdf, 0x8a, 0xb0, 0x7c, 0x8d, 0x72, 0xbf, 0xe7, 0xb8, 0x7c, 0x27, 0x72, 0x1d, 0xee, - 0x47, 0x21, 0xfa, 0x04, 0x0a, 0x6c, 0xad, 0x61, 0x5d, 0xb4, 0xde, 0xae, 0x5f, 0xd9, 0x68, 0x9d, - 0x76, 0x09, 0x5a, 0xdd, 0xb5, 0x04, 0xb9, 0x53, 0x99, 0x8c, 0x9b, 0x85, 0xee, 0x1a, 0x2e, 0xb0, - 0x35, 0x64, 0x43, 0xc5, 0x0f, 0x03, 0x3f, 0x24, 0x8d, 0xc2, 0x45, 0xeb, 0xed, 0x5a, 0x07, 0x26, - 0xe3, 0x66, 0x65, 0x4b, 0x4a, 0xb0, 0xd6, 0x20, 0x0f, 0x4a, 0x3d, 0x3f, 0x20, 0x8d, 0xa2, 0x8c, - 0xe1, 0xfa, 0xe9, 0x63, 0xb8, 0xee, 0x07, 0xc4, 0x44, 0x51, 0x9d, 0x8c, 0x9b, 0x25, 0x21, 0xc1, - 0x12, 0x1d, 0x3d, 0x84, 0xe2, 0x90, 0x06, 0x8d, 0x92, 0x74, 0xb2, 0x79, 0x7a, 0x27, 0xf7, 0xf0, - 0x8e, 0xf1, 0xb1, 0x30, 0x19, 0x37, 0x8b, 0xf7, 0xf0, 0x0e, 0x16, 0xd0, 0xe8, 0x31, 0xd4, 0xdc, - 0x28, 0xec, 0xf9, 0xfd, 0x81, 0x13, 0x37, 0xca, 0xd2, 0xcf, 0xf6, 0xe9, 0xfd, 0xac, 0x27, 0x50, - 0xc6, 0xdb, 0xf9, 0xc9, 0xb8, 0x59, 0x33, 0x62, 0x9c, 0x3a, 0xb3, 0x7f, 0x61, 0xc1, 0x85, 0x23, - 0xf6, 0xe8, 0x22, 0x94, 0x42, 0x67, 0x40, 0xe4, 0xda, 0xd6, 0x3a, 0x8b, 0x4f, 0xc7, 0xcd, 0x73, - 0x22, 0x27, 0xb7, 0x9d, 0x01, 0xc1, 0x52, 0x83, 0xda, 0x50, 0x13, 0xff, 0xb3, 0xd8, 0x71, 0x93, - 0x05, 0xba, 0xa0, 0xcd, 0x6a, 0xb7, 0x13, 0x05, 0x4e, 0x6d, 0xd0, 0xd7, 0xa0, 0x78, 0x40, 0x46, - 0x72, 0xa5, 0x6a, 0x9d, 0xba, 0x36, 0x2d, 0x6e, 0x93, 0x11, 0x16, 0x72, 0xfb, 0xf3, 0x02, 0x94, - 0x36, 0x1c, 0xee, 0xa0, 0x03, 0x58, 0xe8, 0xf9, 0x01, 0x27, 0x94, 0x35, 0xac, 0x8b, 0xc5, 0xf9, - 0x76, 0x96, 0x00, 0xbc, 0x2e, 0xc1, 0x3a, 0xf5, 0xc9, 0xb8, 0xb9, 0xa0, 0xbe, 0x19, 0x4e, 0x3c, - 0xa0, 0x5f, 0x5b, 0xb0, 0x4c, 0x98, 0xeb, 0x04, 0x72, 0x43, 0xef, 0x46, 0x81, 0xef, 0x8e, 0xe4, - 0x6c, 0xea, 0x57, 0x6e, 0x9e, 0xde, 0xed, 0x66, 0x0e, 0xb1, 0xf3, 0xfa, 0x64, 0xdc, 0x5c, 0xce, - 0x4b, 0xf1, 0x11, 0xcf, 0xf6, 0x93, 0x02, 0x40, 0x1a, 0xb3, 0x58, 0x85, 0xd8, 0xe1, 0xfb, 0xf9, - 0x55, 0xd8, 0x75, 0xf8, 0x3e, 0x96, 0x1a, 0xf4, 0x0e, 0x94, 0xf8, 0x28, 0x4e, 0x16, 0xa0, 0x91, - 0x58, 0x7c, 0x3c, 0x8a, 0xc9, 0xf3, 0x71, 0xb3, 0x7a, 0xb3, 0x7b, 0xe7, 0xb6, 0xf8, 0xc6, 0xd2, - 0x0a, 0xbd, 0x09, 0xe5, 0x43, 0x27, 0x18, 0x12, 0xbd, 0x08, 0xe7, 0xb5, 0x79, 0xf9, 0xbe, 0x10, - 0x62, 0xa5, 0x3b, 0x3e, 0x25, 0xa5, 0x57, 0x96, 0x92, 0xdf, 0x58, 0x70, 0xc4, 0x6c, 0x86, 0xed, - 0xf9, 0x3e, 0x94, 0x03, 0x72, 0x48, 0x02, 0x9d, 0x99, 0x8b, 0xc9, 0x54, 0x77, 0x84, 0xf0, 0xf9, - 0xb8, 0xb9, 0x94, 0x62, 0x4a, 0x11, 0x56, 0xe6, 0xe8, 0x1b, 0xb0, 0x30, 0x20, 0x8c, 0x39, 0xfd, - 0x24, 0x49, 0x4b, 0x7a, 0xe4, 0xc2, 0x2d, 0x25, 0xc6, 0x89, 0xde, 0xfe, 0xad, 0x05, 0xe5, 0x4d, - 0x31, 0x6d, 0xf4, 0x29, 0x2c, 0xb8, 0x51, 0xc8, 0xc9, 0x63, 0xae, 0x8b, 0xe1, 0x1c, 0x85, 0x48, - 0x22, 0xae, 0x2b, 0xb4, 0xd4, 0xb9, 0x16, 0xe0, 0xc4, 0x0f, 0x6a, 0x42, 0xc9, 0x73, 0xb8, 0x23, - 0xa7, 0xb7, 0xa8, 0x36, 0xf7, 0xae, 0x33, 0x0a, 0x22, 0xc7, 0xc3, 0x52, 0x61, 0xff, 0x61, 0x01, - 0x16, 0xb3, 0x58, 0xe2, 0xc0, 0x4a, 0xdf, 0x62, 0x3f, 0xe8, 0xc4, 0x99, 0x03, 0xbb, 0x99, 0x28, - 0x70, 0x6a, 0x83, 0x36, 0x60, 0xd9, 0xfc, 0xb8, 0x4f, 0x28, 0xf3, 0xa3, 0x30, 0xb7, 0xcf, 0x96, - 0x37, 0x73, 0x7a, 0x7c, 0x64, 0x04, 0xba, 0x09, 0xc8, 0x0d, 0xa2, 0xa1, 0x27, 0x4d, 0x59, 0x82, - 0xa3, 0x72, 0xbb, 0xa2, 0x71, 0xd0, 0xfa, 0x11, 0x0b, 0x7c, 0xcc, 0x28, 0xe4, 0x40, 0x85, 0x45, - 0x43, 0xea, 0x12, 0xbd, 0x1f, 0x3f, 0x98, 0xa7, 0x14, 0x6f, 0xa9, 0x86, 0xd2, 0x95, 0x80, 0x58, - 0x03, 0x8b, 0xf5, 0x97, 0x43, 0xb7, 0x36, 0x64, 0x19, 0xce, 0xac, 0xff, 0xa6, 0x12, 0xe3, 0x44, - 0x8f, 0x1e, 0x26, 0x09, 0xf5, 0x07, 0xa4, 0x51, 0x91, 0x01, 0xb5, 0x5b, 0xaa, 0xb7, 0xb6, 0xb2, - 0xbd, 0x35, 0x0d, 0x42, 0xb4, 0xfe, 0xd6, 0xe1, 0xe5, 0xd6, 0x2d, 0xdf, 0xa5, 0x91, 0x18, 0x96, - 0x5f, 0x01, 0x7f, 0x60, 0x56, 0xc0, 0x1f, 0x10, 0xf4, 0x08, 0x6a, 0xaa, 0x87, 0xdf, 0xc3, 0x3b, - 0x8d, 0x85, 0xb3, 0x98, 0xb2, 0xec, 0x03, 0xdd, 0x04, 0x13, 0xa7, 0xf0, 0xe8, 0x3d, 0xa8, 0xcb, - 0xbd, 0xa5, 0x37, 0x48, 0x55, 0x4e, 0xfe, 0xff, 0x74, 0x78, 0xf5, 0xf5, 0x54, 0x85, 0xb3, 0x76, - 0xe8, 0x57, 0x16, 0x00, 0x79, 0xcc, 0x49, 0x28, 0x16, 0x88, 0x35, 0x6a, 0xb2, 0x62, 0xdf, 0x3f, - 0x9b, 0xed, 0xdf, 0xda, 0x34, 0xc0, 0x9b, 0x21, 0xa7, 0xa3, 0x0e, 0xd2, 0xe1, 0x40, 0xaa, 0xc0, - 0x19, 0xef, 0xc7, 0x97, 0x2e, 0x78, 0x55, 0xa5, 0x6b, 0xe5, 0x03, 0x58, 0xca, 0xcd, 0x00, 0x2d, - 0xab, 0x26, 0x28, 0x8f, 0x9f, 0xec, 0x7b, 0xe8, 0xf5, 0xa4, 0x26, 0xcb, 0xa3, 0xa5, 0x8b, 0xf0, - 0x77, 0x0a, 0x57, 0x2d, 0xfb, 0x1f, 0x16, 0x2c, 0xc9, 0x74, 0x6c, 0x90, 0x98, 0x84, 0x1e, 0x09, - 0x67, 0x2a, 0x7c, 0xef, 0x40, 0xd5, 0x23, 0x8e, 0x67, 0x78, 0x53, 0xb1, 0xb3, 0xac, 0xad, 0xaa, - 0x1b, 0x5a, 0x8e, 0x8d, 0x05, 0xfa, 0x51, 0xda, 0x6c, 0x15, 0x85, 0xba, 0x33, 0xe7, 0xd2, 0xa5, - 0xb1, 0xea, 0xbe, 0x6b, 0xce, 0x4f, 0xbe, 0xf7, 0xda, 0xff, 0x29, 0xc0, 0xff, 0x1f, 0x3b, 0x66, - 0x86, 0x59, 0xee, 0x41, 0x49, 0x50, 0x5c, 0xdd, 0xaa, 0xe7, 0x60, 0x08, 0xe2, 0x9c, 0xe9, 0x48, - 0x25, 0xeb, 0x93, 0x47, 0x50, 0x62, 0xa3, 0x41, 0x5a, 0xd5, 0x8b, 0x67, 0x5a, 0xd5, 0xeb, 0xc7, - 0x56, 0xf4, 0x4f, 0x74, 0x45, 0x57, 0xa5, 0xed, 0xbb, 0xf3, 0x91, 0x1e, 0x35, 0x19, 0xf1, 0xa5, - 0xdb, 0xc1, 0x25, 0x58, 0xcc, 0x52, 0xdc, 0x17, 0x53, 0x0b, 0xfb, 0xe7, 0x16, 0x2c, 0x7f, 0x44, - 0xa3, 0x61, 0xac, 0xab, 0xef, 0xb6, 0x1f, 0x7a, 0x82, 0x41, 0xf4, 0x85, 0x4c, 0x8f, 0x33, 0x0c, - 0x42, 0x1a, 0x62, 0xa5, 0x13, 0x35, 0xf4, 0x70, 0xaa, 0x5f, 0x98, 0x3d, 0x90, 0x14, 0xf7, 0x44, - 0x2f, 0xc2, 0x38, 0xf0, 0x43, 0x4f, 0xf7, 0x03, 0x13, 0x86, 0xf0, 0x85, 0xa5, 0xc6, 0xfe, 0x53, - 0x09, 0xe0, 0x76, 0xe4, 0x91, 0x2e, 0x77, 0xf8, 0x90, 0xa1, 0x15, 0x28, 0xf8, 0x9e, 0xf6, 0x0e, - 0xda, 0xbc, 0xb0, 0xb5, 0x81, 0x0b, 0xbe, 0x67, 0xb6, 0x4d, 0xe1, 0xc4, 0x6d, 0xf3, 0x1e, 0xd4, - 0x3d, 0x9f, 0xc5, 0x81, 0x33, 0x12, 0x42, 0xed, 0xd5, 0x14, 0xb9, 0x8d, 0x54, 0x85, 0xb3, 0x76, - 0x86, 0x65, 0x95, 0x8e, 0x67, 0x59, 0x22, 0xbc, 0x0c, 0xcb, 0xba, 0x04, 0xe5, 0x78, 0xdf, 0x61, - 0x44, 0x37, 0x90, 0xa4, 0xc9, 0x95, 0x77, 0x85, 0xf0, 0xb9, 0xa0, 0xc7, 0x91, 0x47, 0xe4, 0x0f, - 0xac, 0x0c, 0x45, 0x27, 0x61, 0xdc, 0xa1, 0x9c, 0x78, 0xd7, 0xf8, 0xdc, 0x9d, 0xa4, 0x9b, 0x20, - 0xe1, 0x14, 0x14, 0xf5, 0x44, 0x75, 0x1f, 0xc4, 0x01, 0x51, 0x3e, 0x16, 0x4e, 0xe7, 0x23, 0xd3, - 0x0e, 0x0c, 0x16, 0xce, 0x02, 0x67, 0xe9, 0x53, 0xf5, 0x7f, 0xd3, 0x27, 0x14, 0x40, 0x3d, 0x70, - 0x38, 0x61, 0x5c, 0x9e, 0x8d, 0x46, 0x4d, 0x86, 0xf4, 0xbd, 0x39, 0x8f, 0x58, 0xa7, 0x26, 0x32, - 0x2d, 0x3f, 0x71, 0x16, 0xde, 0xfe, 0xbc, 0x0c, 0xaf, 0x61, 0xa2, 0x9a, 0xfc, 0x9d, 0xbd, 0x47, - 0xc4, 0xe5, 0xd3, 0x37, 0x18, 0x6b, 0x86, 0x1b, 0xcc, 0x8f, 0xa1, 0x12, 0x38, 0x7b, 0x24, 0x10, - 0xb5, 0x52, 0xb4, 0xb9, 0x8f, 0x4f, 0x1f, 0xec, 0x74, 0x28, 0xad, 0x1d, 0x09, 0xab, 0x9a, 0xdc, - 0x6b, 0x3a, 0x86, 0x8a, 0x12, 0x62, 0xed, 0x13, 0xfd, 0x14, 0x20, 0x76, 0xa8, 0x33, 0x20, 0xb2, - 0x5a, 0x97, 0x64, 0x04, 0xdb, 0xf3, 0x47, 0xb0, 0x9b, 0x60, 0xa6, 0xdd, 0xd5, 0x88, 0x18, 0xce, - 0xb8, 0x44, 0x4f, 0x2c, 0x58, 0xee, 0xe7, 0x0a, 0x82, 0xbe, 0xab, 0xce, 0xd1, 0x5d, 0xf3, 0x25, - 0x26, 0x25, 0x97, 0x79, 0x0d, 0x3e, 0xe2, 0x1d, 0x51, 0x43, 0x08, 0x2b, 0xf3, 0xc6, 0x91, 0x7f, - 0xdc, 0x48, 0xd7, 0x61, 0x9a, 0x21, 0xae, 0x7c, 0x1b, 0xea, 0x99, 0xe5, 0x7a, 0xa9, 0x8e, 0xfe, - 0x3b, 0x0b, 0x2e, 0x1c, 0xc9, 0x3b, 0x0a, 0xa0, 0xc8, 0xa8, 0xab, 0x6f, 0x0e, 0x77, 0xcf, 0x70, - 0x45, 0x55, 0xe0, 0xea, 0xa5, 0xa1, 0x4b, 0x5d, 0x2c, 0xdc, 0x88, 0x22, 0xe9, 0x11, 0xc6, 0xf3, - 0x45, 0x72, 0x83, 0x30, 0x8e, 0xa5, 0xc6, 0xfe, 0x99, 0x05, 0x6f, 0x9c, 0x80, 0x25, 0xea, 0xbf, - 0x0c, 0x23, 0x5f, 0xff, 0xd5, 0x89, 0x53, 0x3a, 0xd3, 0x5b, 0x0a, 0x27, 0x5e, 0x5b, 0x9b, 0xd3, - 0x17, 0xd1, 0x5a, 0xfe, 0x12, 0x6a, 0x2f, 0xc1, 0x79, 0x4c, 0x38, 0x1d, 0x75, 0x39, 0x75, 0x38, - 0xe9, 0x8f, 0xec, 0xbf, 0x17, 0x00, 0xd2, 0x77, 0xa2, 0xe4, 0x31, 0xc1, 0x3a, 0xfe, 0x31, 0x01, - 0xdd, 0x4f, 0xc2, 0x54, 0x21, 0x7c, 0x38, 0x15, 0xe6, 0xf3, 0x71, 0xb3, 0x9d, 0x79, 0xf4, 0x1b, - 0xf8, 0xa1, 0x1f, 0xa9, 0x7f, 0xdf, 0xed, 0x47, 0xad, 0xdb, 0x11, 0xf7, 0x7b, 0xbe, 0xda, 0x03, - 0xe9, 0xb5, 0x48, 0xcf, 0xac, 0x07, 0x15, 0xc5, 0x5e, 0x34, 0x23, 0xe8, 0xcc, 0xf3, 0xe8, 0xa5, - 0x69, 0x87, 0xbc, 0x85, 0xa8, 0x6f, 0xac, 0xd1, 0x51, 0x00, 0x55, 0xb6, 0xd6, 0x19, 0xba, 0x07, - 0x84, 0x6b, 0x3e, 0x30, 0x97, 0x27, 0x85, 0xd4, 0x59, 0x14, 0x24, 0x30, 0xf9, 0x85, 0x8d, 0x07, - 0x7b, 0x5c, 0x00, 0x23, 0x16, 0xfc, 0x91, 0x84, 0x5e, 0x1c, 0xf9, 0x66, 0x91, 0x0d, 0x7f, 0xdc, - 0xd4, 0x72, 0x6c, 0x2c, 0xd0, 0x5b, 0x50, 0xd9, 0x53, 0x61, 0xaa, 0x4c, 0x9b, 0x43, 0xa3, 0x9d, - 0x68, 0xad, 0xb0, 0xa3, 0xa4, 0x9f, 0xde, 0xfc, 0x8c, 0x1d, 0x96, 0x52, 0xac, 0xb5, 0xc2, 0xbb, - 0x1f, 0x32, 0xe2, 0x0e, 0xa9, 0xea, 0xb6, 0xd5, 0xd4, 0xfb, 0x96, 0x96, 0x63, 0x63, 0x81, 0x30, - 0xd4, 0x1c, 0xd7, 0x25, 0x8c, 0x6d, 0x93, 0x91, 0xae, 0x44, 0x5f, 0xcf, 0xf4, 0xb4, 0x96, 0x1b, - 0x51, 0x22, 0x3a, 0x58, 0x97, 0xb8, 0x94, 0xf0, 0x6d, 0x32, 0xea, 0x92, 0x80, 0xb8, 0x3c, 0xa2, - 0xea, 0x1e, 0x74, 0x2d, 0x19, 0x8b, 0x53, 0x18, 0x81, 0xc9, 0x12, 0x73, 0x5d, 0x55, 0x5e, 0x06, - 0xd3, 0x88, 0x71, 0x0a, 0x63, 0x3f, 0x10, 0xf9, 0xd5, 0xdc, 0xf6, 0x2d, 0xa8, 0xc4, 0x94, 0xf4, - 0xfc, 0xc7, 0x3a, 0xbb, 0x26, 0x13, 0xbb, 0x52, 0x8a, 0xb5, 0x56, 0xd8, 0xb1, 0x61, 0x4f, 0xd8, - 0xe5, 0x32, 0xdb, 0x95, 0x52, 0xac, 0xb5, 0xf6, 0x1f, 0x0b, 0x50, 0xe9, 0xca, 0x15, 0x47, 0x0f, - 0xa1, 0x2a, 0x7a, 0xb6, 0x64, 0x91, 0xaa, 0x9a, 0x5c, 0x9a, 0xad, 0xc3, 0xab, 0x2e, 0x74, 0x8b, - 0x70, 0x27, 0x6d, 0x02, 0xa9, 0x0c, 0x1b, 0x54, 0xd4, 0x83, 0x12, 0x8b, 0x89, 0x3b, 0x3f, 0xed, - 0x56, 0x11, 0x77, 0x63, 0xe2, 0xa6, 0xf5, 0x41, 0xfc, 0xc2, 0x12, 0x1f, 0x85, 0x50, 0x61, 0x92, - 0xef, 0xcd, 0xcf, 0xbc, 0xb5, 0x27, 0x89, 0x96, 0x49, 0xa2, 0xfc, 0x8d, 0xb5, 0x17, 0xfb, 0x2f, - 0x16, 0x80, 0x32, 0xdc, 0xf1, 0x99, 0xa0, 0xe2, 0xf9, 0x44, 0xb6, 0x66, 0x4b, 0xa4, 0x18, 0x2d, - 0xd3, 0x68, 0x76, 0x6d, 0x22, 0xc9, 0x24, 0x91, 0x40, 0xd9, 0xe7, 0x64, 0xc0, 0x1a, 0x05, 0xd9, - 0xc3, 0x3f, 0x9c, 0x77, 0x6e, 0x69, 0x15, 0xde, 0x12, 0xb0, 0x58, 0xa1, 0xdb, 0x7f, 0x2d, 0x24, - 0x73, 0x12, 0x89, 0x45, 0xbf, 0xb4, 0x60, 0xd1, 0x4b, 0x2e, 0x5a, 0x3e, 0x49, 0x1e, 0x57, 0xb7, - 0xce, 0xec, 0xbe, 0xd7, 0xf9, 0x8a, 0x0e, 0xe3, 0xc2, 0xb4, 0xc2, 0x27, 0x0c, 0x4f, 0x79, 0x46, - 0x11, 0x54, 0x39, 0xf5, 0xfb, 0x7d, 0xc1, 0x63, 0x54, 0x0e, 0xae, 0xcd, 0x71, 0x81, 0x53, 0x48, - 0x69, 0xc6, 0xb5, 0x80, 0x61, 0xe3, 0x04, 0x6d, 0x03, 0x78, 0x24, 0x0e, 0xa2, 0x91, 0xc8, 0x84, - 0xde, 0x52, 0x5f, 0x3d, 0xee, 0x50, 0xef, 0x46, 0x9e, 0xdc, 0x93, 0xaf, 0x89, 0x13, 0xb0, 0x61, - 0x86, 0xe0, 0xcc, 0x70, 0xfb, 0xdf, 0x25, 0x58, 0xcc, 0x6e, 0xaa, 0x94, 0xef, 0x5b, 0xb3, 0xf2, - 0xfd, 0xef, 0x67, 0xf9, 0xbe, 0x3a, 0x4b, 0xdf, 0x9c, 0x6d, 0x83, 0xcd, 0x40, 0xf5, 0x9d, 0x69, - 0xaa, 0x5f, 0x7c, 0x69, 0xf8, 0x97, 0x62, 0xf9, 0xa5, 0x17, 0xb0, 0xfc, 0x43, 0x28, 0x87, 0x91, - 0x47, 0x58, 0xa3, 0x2c, 0x17, 0xfa, 0xee, 0xd9, 0x1c, 0xe4, 0x96, 0x48, 0xa9, 0xe6, 0xcb, 0x66, - 0xf7, 0x4b, 0x19, 0x56, 0xee, 0xd0, 0x35, 0x58, 0xd2, 0x11, 0xfb, 0x51, 0xb8, 0x1e, 0x0d, 0x43, - 0x75, 0xb1, 0x2a, 0x77, 0xde, 0xd0, 0xe6, 0x4b, 0xeb, 0xd3, 0x6a, 0x9c, 0xb7, 0x5f, 0xf9, 0x89, - 0xba, 0x78, 0x9e, 0xc8, 0xf3, 0x1e, 0x64, 0x79, 0xde, 0x5c, 0xd5, 0x30, 0xbd, 0xdf, 0x66, 0xd9, - 0xe2, 0xc4, 0x02, 0x48, 0x9f, 0x27, 0x04, 0xf5, 0x92, 0x8b, 0x9c, 0xa7, 0x5e, 0x72, 0x13, 0x60, - 0xa5, 0x13, 0xd4, 0x8b, 0xf1, 0x28, 0xce, 0x53, 0xaf, 0x2e, 0x8f, 0x62, 0x2c, 0x35, 0xc7, 0xbf, - 0x91, 0x15, 0x5f, 0xd9, 0xf3, 0xfe, 0x9f, 0x0b, 0xb0, 0xa0, 0x4f, 0xec, 0x0c, 0xcf, 0x3e, 0x14, - 0xaa, 0x54, 0x33, 0x53, 0x9d, 0xf5, 0x1b, 0x67, 0x75, 0x07, 0x53, 0xec, 0x28, 0x91, 0x61, 0xe3, - 0xe7, 0x25, 0xfe, 0x22, 0x80, 0x3e, 0xb3, 0xe0, 0x3c, 0x25, 0x71, 0x60, 0x68, 0xab, 0x26, 0x6f, - 0x1f, 0xcd, 0x13, 0x64, 0x86, 0x05, 0x77, 0x2e, 0x4c, 0xc6, 0xcd, 0x69, 0x62, 0x8c, 0xa7, 0x1d, - 0xda, 0xbf, 0x2f, 0x40, 0xf1, 0x1e, 0xde, 0x92, 0xf4, 0xc1, 0xdd, 0x27, 0x26, 0x9b, 0x69, 0xe7, - 0x93, 0x52, 0xac, 0xb5, 0x22, 0xe7, 0x43, 0x46, 0x68, 0x7e, 0xc3, 0xdc, 0x63, 0x84, 0x62, 0xa9, - 0x11, 0x94, 0x2c, 0x76, 0x18, 0xfb, 0x61, 0x44, 0x93, 0x67, 0x1a, 0x53, 0x6a, 0x77, 0xb5, 0x1c, - 0x1b, 0x0b, 0x81, 0xb7, 0x1f, 0x31, 0xae, 0xeb, 0x82, 0xc1, 0xbb, 0x11, 0x89, 0xeb, 0x85, 0xd0, - 0xc8, 0xdb, 0x41, 0x44, 0xb9, 0xe4, 0x6b, 0xe5, 0xcc, 0xed, 0x20, 0xa2, 0x1c, 0x4b, 0x8d, 0xb9, - 0x3f, 0x54, 0x4e, 0xbc, 0x3f, 0xbc, 0x09, 0xe5, 0x4f, 0x87, 0x84, 0x8e, 0xe4, 0x43, 0x46, 0xe6, - 0x2c, 0xdc, 0x15, 0x42, 0xac, 0x74, 0x22, 0xf0, 0x1e, 0x75, 0xfa, 0x03, 0x71, 0x0f, 0xa8, 0x4e, - 0x07, 0x7e, 0x5d, 0xcb, 0xb1, 0xb1, 0xb0, 0x5d, 0xa8, 0x67, 0xfe, 0x3c, 0x3b, 0xc3, 0x9f, 0xde, - 0xae, 0x00, 0x1c, 0x12, 0xea, 0xf7, 0x46, 0xeb, 0x84, 0xaa, 0x2a, 0x5e, 0x4d, 0xd9, 0xd3, 0x7d, - 0xa3, 0xc1, 0x19, 0xab, 0x4e, 0xeb, 0xe9, 0xb3, 0xd5, 0x73, 0x5f, 0x3c, 0x5b, 0x3d, 0xf7, 0xe5, - 0xb3, 0xd5, 0x73, 0x9f, 0x4d, 0x56, 0xad, 0xa7, 0x93, 0x55, 0xeb, 0x8b, 0xc9, 0xaa, 0xf5, 0xe5, - 0x64, 0xd5, 0xfa, 0xe7, 0x64, 0xd5, 0x7a, 0xf2, 0xaf, 0xd5, 0x73, 0x0f, 0xaa, 0xc9, 0xea, 0xff, - 0x37, 0x00, 0x00, 0xff, 0xff, 0x07, 0x4b, 0x73, 0x01, 0x21, 0x21, 0x00, 0x00, + proto.RegisterFile("github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1/generated.proto", fileDescriptor_generated_7f43a4b5cc4e77b1) +} + +var fileDescriptor_generated_7f43a4b5cc4e77b1 = []byte{ + // 2670 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0x4d, 0x6f, 0x23, 0xc7, + 0xd1, 0xde, 0xe1, 0x97, 0xc8, 0x92, 0xd6, 0xd2, 0xb6, 0x6d, 0x98, 0xaf, 0x0c, 0x8b, 0xfb, 0x8e, + 0x11, 0xc3, 0x09, 0x6c, 0xd2, 0xde, 0x8d, 0x0d, 0x27, 0x80, 0x13, 0x8b, 0xa2, 0xd6, 0x96, 0xa5, + 0x95, 0xe5, 0xa6, 0x77, 0x03, 0x38, 0x06, 0xb2, 0xad, 0x99, 0x26, 0x35, 0xd6, 0x70, 0x66, 0x3c, + 0xdd, 0x64, 0x96, 0x41, 0x90, 0x38, 0x46, 0x12, 0x04, 0x46, 0x0e, 0xbe, 0xe5, 0x90, 0x63, 0xfe, + 0x43, 0xae, 0x41, 0x82, 0x1c, 0x7c, 0x09, 0xe0, 0x5c, 0x02, 0xe7, 0x10, 0x22, 0x66, 0x80, 0x1c, + 0xf2, 0x13, 0xf6, 0x14, 0xf4, 0xc7, 0xf4, 0x0c, 0x87, 0x54, 0xac, 0x15, 0x05, 0xf8, 0xb2, 0x3b, + 0x53, 0x55, 0x5d, 0x55, 0x53, 0xdd, 0x5d, 0xf5, 0x54, 0x51, 0xf0, 0x46, 0xdf, 0xe3, 0x27, 0xc3, + 0xe3, 0xa6, 0x13, 0x0e, 0x5a, 0x24, 0xee, 0x87, 0x51, 0x1c, 0xbe, 0x2f, 0x1f, 0x9e, 0xa7, 0x23, + 0x1a, 0x70, 0xd6, 0x8a, 0x4e, 0xfb, 0x2d, 0x12, 0x79, 0xac, 0xc5, 0x68, 0xc0, 0xc2, 0xb8, 0x35, + 0x7a, 0x91, 0xf8, 0xd1, 0x09, 0x79, 0xb1, 0xd5, 0xa7, 0x01, 0x8d, 0x09, 0xa7, 0x6e, 0x33, 0x8a, + 0x43, 0x1e, 0xa2, 0x57, 0x52, 0x4d, 0xcd, 0x44, 0x93, 0x7c, 0xf8, 0x81, 0xd2, 0xd4, 0x8c, 0x4e, + 0xfb, 0x4d, 0xa1, 0xa9, 0xa9, 0x34, 0x35, 0x13, 0x4d, 0x9b, 0xcf, 0x67, 0x7c, 0xe8, 0x87, 0xfd, + 0xb0, 0x25, 0x15, 0x1e, 0x0f, 0x7b, 0xf2, 0x4d, 0xbe, 0xc8, 0x27, 0x65, 0x68, 0xd3, 0x3e, 0x7d, + 0x85, 0x35, 0xbd, 0x50, 0x78, 0xd5, 0x72, 0xc2, 0x98, 0xb6, 0x46, 0x73, 0xce, 0x6c, 0x7e, 0x33, + 0x95, 0x19, 0x10, 0xe7, 0xc4, 0x0b, 0x68, 0x3c, 0x4e, 0x3f, 0x65, 0x40, 0x39, 0x59, 0xb4, 0xaa, + 0x75, 0xd6, 0xaa, 0x78, 0x18, 0x70, 0x6f, 0x40, 0xe7, 0x16, 0xbc, 0xfc, 0x65, 0x0b, 0x98, 0x73, + 0x42, 0x07, 0x24, 0xbf, 0xce, 0xfe, 0x5b, 0x11, 0x36, 0xb6, 0x63, 0xee, 0xf5, 0x88, 0xc3, 0x0f, + 0x42, 0x87, 0x70, 0x2f, 0x0c, 0xd0, 0x7b, 0x50, 0x60, 0x37, 0xeb, 0xd6, 0x75, 0xeb, 0xd9, 0xd5, + 0x1b, 0x9d, 0xe6, 0x45, 0xa3, 0xd9, 0xec, 0xde, 0x4c, 0x34, 0xb7, 0x2b, 0xd3, 0x49, 0xa3, 0xd0, + 0xbd, 0x89, 0x0b, 0xec, 0x26, 0xb2, 0xa1, 0xe2, 0x05, 0xbe, 0x17, 0xd0, 0x7a, 0xe1, 0xba, 0xf5, + 0x6c, 0xad, 0x0d, 0xd3, 0x49, 0xa3, 0xb2, 0x27, 0x29, 0x58, 0x73, 0x90, 0x0b, 0xa5, 0x9e, 0xe7, + 0xd3, 0x7a, 0x51, 0xfa, 0x70, 0xeb, 0xe2, 0x3e, 0xdc, 0xf2, 0x7c, 0x6a, 0xbc, 0xa8, 0x4e, 0x27, + 0x8d, 0x92, 0xa0, 0x60, 0xa9, 0x1d, 0xdd, 0x83, 0xe2, 0x30, 0xf6, 0xeb, 0x25, 0x69, 0x64, 0xf7, + 0xe2, 0x46, 0xee, 0xe0, 0x03, 0x63, 0x63, 0x65, 0x3a, 0x69, 0x14, 0xef, 0xe0, 0x03, 0x2c, 0x54, + 0xa3, 0xfb, 0x50, 0x73, 0xc2, 0xa0, 0xe7, 0xf5, 0x07, 0x24, 0xaa, 0x97, 0xa5, 0x9d, 0xfd, 0x8b, + 0xdb, 0xd9, 0x49, 0x54, 0x19, 0x6b, 0x57, 0xa7, 0x93, 0x46, 0xcd, 0x90, 0x71, 0x6a, 0xcc, 0xfe, + 0x85, 0x05, 0xd7, 0xe6, 0xe4, 0xd1, 0x75, 0x28, 0x05, 0x64, 0x40, 0xe5, 0xde, 0xd6, 0xda, 0x6b, + 0x9f, 0x4e, 0x1a, 0x57, 0x44, 0x4c, 0x0e, 0xc9, 0x80, 0x62, 0xc9, 0x41, 0x2d, 0xa8, 0x89, 0xff, + 0x59, 0x44, 0x9c, 0x64, 0x83, 0xae, 0x69, 0xb1, 0xda, 0x61, 0xc2, 0xc0, 0xa9, 0x0c, 0x7a, 0x0a, + 0x8a, 0xa7, 0x74, 0x2c, 0x77, 0xaa, 0xd6, 0x5e, 0xd5, 0xa2, 0xc5, 0x7d, 0x3a, 0xc6, 0x82, 0x6e, + 0x7f, 0x54, 0x80, 0x52, 0x87, 0x70, 0x82, 0x4e, 0x61, 0xa5, 0xe7, 0xf9, 0x9c, 0xc6, 0xac, 0x6e, + 0x5d, 0x2f, 0x2e, 0x77, 0xb2, 0x84, 0xc2, 0x5b, 0x52, 0x59, 0x7b, 0x75, 0x3a, 0x69, 0xac, 0xa8, + 0x67, 0x86, 0x13, 0x0b, 0xe8, 0xd7, 0x16, 0x6c, 0x50, 0xe6, 0x10, 0x5f, 0x1e, 0xe8, 0xa3, 0xd0, + 0xf7, 0x9c, 0xb1, 0xfc, 0x9a, 0xd5, 0x1b, 0x6f, 0x5e, 0xdc, 0xec, 0x6e, 0x4e, 0x63, 0xfb, 0xb1, + 0xe9, 0xa4, 0xb1, 0x91, 0xa7, 0xe2, 0x39, 0xcb, 0xf6, 0x27, 0x05, 0x80, 0xd4, 0x67, 0xb1, 0x0b, + 0x11, 0xe1, 0x27, 0xf9, 0x5d, 0x38, 0x22, 0xfc, 0x04, 0x4b, 0x0e, 0x7a, 0x0e, 0x4a, 0x7c, 0x1c, + 0x25, 0x1b, 0x50, 0x4f, 0x24, 0xde, 0x19, 0x47, 0xf4, 0xc1, 0xa4, 0x51, 0x7d, 0xb3, 0xfb, 0xd6, + 0xa1, 0x78, 0xc6, 0x52, 0x0a, 0x3d, 0x0d, 0xe5, 0x11, 0xf1, 0x87, 0x54, 0x6f, 0xc2, 0x55, 0x2d, + 0x5e, 0xbe, 0x2b, 0x88, 0x58, 0xf1, 0x16, 0x87, 0xa4, 0xf4, 0x95, 0x85, 0xe4, 0x37, 0x16, 0xcc, + 0x89, 0x9d, 0xe3, 0x78, 0xbe, 0x0c, 0x65, 0x9f, 0x8e, 0xa8, 0xaf, 0x23, 0x73, 0x3d, 0xf9, 0xd4, + 0x03, 0x41, 0x7c, 0x30, 0x69, 0xac, 0xa7, 0x3a, 0x25, 0x09, 0x2b, 0x71, 0xf4, 0x75, 0x58, 0x19, + 0x50, 0xc6, 0x48, 0x3f, 0x09, 0xd2, 0xba, 0x5e, 0xb9, 0x72, 0x5b, 0x91, 0x71, 0xc2, 0xb7, 0x7f, + 0x6b, 0x41, 0x79, 0x57, 0x7c, 0x36, 0xfa, 0x00, 0x56, 0x9c, 0x30, 0xe0, 0xf4, 0x3e, 0xd7, 0xc9, + 0x70, 0x89, 0x44, 0x24, 0x35, 0xee, 0x28, 0x6d, 0xa9, 0x71, 0x4d, 0xc0, 0x89, 0x1d, 0xd4, 0x80, + 0x92, 0x4b, 0x38, 0x91, 0x9f, 0xb7, 0xa6, 0x0e, 0xf7, 0x11, 0x19, 0xfb, 0x21, 0x71, 0xb1, 0x64, + 0xd8, 0x7f, 0x58, 0x81, 0xb5, 0xac, 0x2e, 0x71, 0x61, 0xa5, 0x6d, 0x71, 0x1e, 0x74, 0xe0, 0xcc, + 0x85, 0xdd, 0x4d, 0x18, 0x38, 0x95, 0x41, 0x1d, 0xd8, 0x30, 0x2f, 0x77, 0x69, 0xcc, 0xbc, 0x30, + 0xc8, 0x9d, 0xb3, 0x8d, 0xdd, 0x1c, 0x1f, 0xcf, 0xad, 0x40, 0x6f, 0x02, 0x72, 0xfc, 0x70, 0xe8, + 0x4a, 0x51, 0x96, 0xe8, 0x51, 0xb1, 0xdd, 0xd4, 0x7a, 0xd0, 0xce, 0x9c, 0x04, 0x5e, 0xb0, 0x0a, + 0x11, 0xa8, 0xb0, 0x70, 0x18, 0x3b, 0x54, 0x9f, 0xc7, 0x57, 0x97, 0x49, 0xc5, 0x7b, 0xaa, 0xa0, + 0x74, 0xa5, 0x42, 0xac, 0x15, 0x8b, 0xfd, 0x97, 0x4b, 0xf7, 0x3a, 0x32, 0x0d, 0x67, 0xf6, 0x7f, + 0x57, 0x91, 0x71, 0xc2, 0x47, 0xf7, 0x92, 0x80, 0x7a, 0x03, 0x5a, 0xaf, 0x48, 0x87, 0x5a, 0x4d, + 0x55, 0x5e, 0x9b, 0xd9, 0xf2, 0x9a, 0x3a, 0x21, 0xaa, 0x78, 0x73, 0xf4, 0x62, 0xf3, 0xb6, 0xe7, + 0xc4, 0xa1, 0x58, 0x96, 0xdf, 0x01, 0x6f, 0x60, 0x76, 0xc0, 0x1b, 0x50, 0xf4, 0x3e, 0xd4, 0x54, + 0x39, 0xbe, 0x83, 0x0f, 0xea, 0x2b, 0x97, 0xf1, 0xc9, 0xb2, 0x0e, 0x74, 0x13, 0x9d, 0x38, 0x55, + 0x8f, 0x5e, 0x82, 0x55, 0x79, 0xb6, 0xf4, 0x01, 0xa9, 0xca, 0x8f, 0x7f, 0x54, 0xbb, 0xb7, 0xba, + 0x93, 0xb2, 0x70, 0x56, 0x0e, 0x7d, 0x6c, 0x01, 0xd0, 0xfb, 0x9c, 0x06, 0x62, 0x83, 0x58, 0xbd, + 0x26, 0x33, 0xf6, 0xdd, 0xcb, 0x39, 0xfe, 0xcd, 0x5d, 0xa3, 0x78, 0x37, 0xe0, 0xf1, 0xb8, 0x8d, + 0xb4, 0x3b, 0x90, 0x32, 0x70, 0xc6, 0xfa, 0xe2, 0xd4, 0x05, 0x5f, 0x55, 0xea, 0xda, 0x7c, 0x15, + 0xd6, 0x73, 0x5f, 0x80, 0x36, 0x54, 0x11, 0x94, 0xd7, 0x4f, 0xd6, 0x3d, 0xf4, 0x58, 0x92, 0x93, + 0xe5, 0xd5, 0xd2, 0x49, 0xf8, 0xdb, 0x85, 0x57, 0x2c, 0xfb, 0x1f, 0x16, 0xac, 0xcb, 0x70, 0x74, + 0x68, 0x44, 0x03, 0x97, 0x06, 0xe7, 0x4a, 0x7c, 0xcf, 0x41, 0xd5, 0xa5, 0xc4, 0x35, 0xb8, 0xa9, + 0xd8, 0xde, 0xd0, 0x52, 0xd5, 0x8e, 0xa6, 0x63, 0x23, 0x81, 0x7e, 0x94, 0x16, 0x5b, 0x05, 0xa1, + 0xde, 0x5a, 0x72, 0xeb, 0x52, 0x5f, 0x75, 0xdd, 0x35, 0xf7, 0x27, 0x5f, 0x7b, 0xed, 0xff, 0x14, + 0xe0, 0xf1, 0x85, 0x6b, 0xce, 0xf1, 0x95, 0xc7, 0x50, 0x12, 0x68, 0x55, 0x97, 0xea, 0x25, 0x10, + 0x82, 0xb8, 0x67, 0xda, 0x53, 0x89, 0xfa, 0xe4, 0x15, 0x94, 0xba, 0xd1, 0x20, 0xcd, 0xea, 0xc5, + 0x4b, 0xcd, 0xea, 0xab, 0x0b, 0x33, 0xfa, 0x7b, 0x3a, 0xa3, 0xab, 0xd4, 0xf6, 0x9d, 0xe5, 0x40, + 0x8f, 0xfa, 0x18, 0xf1, 0xa4, 0xcb, 0xc1, 0xc7, 0x05, 0xb8, 0x2a, 0x9d, 0x38, 0x12, 0x70, 0xde, + 0x09, 0x7d, 0xf4, 0x92, 0x86, 0x0e, 0x2a, 0xc8, 0xff, 0x9f, 0x83, 0x0e, 0xd7, 0x66, 0x84, 0x33, + 0x18, 0xe2, 0x1e, 0x94, 0x4e, 0x38, 0x8f, 0x74, 0xe4, 0x97, 0x70, 0xf3, 0x0d, 0xce, 0xa3, 0x74, + 0x6f, 0xc5, 0x1b, 0x96, 0x9a, 0x85, 0x85, 0x80, 0xf0, 0xe4, 0x40, 0x2e, 0x61, 0xe1, 0x90, 0x70, + 0x96, 0x3d, 0x3d, 0x9c, 0x61, 0xa9, 0xd9, 0x7e, 0x01, 0xd6, 0xb2, 0x78, 0xff, 0xcb, 0x71, 0x96, + 0xfd, 0x73, 0x0b, 0x36, 0x5e, 0x8f, 0xc3, 0x61, 0xa4, 0x4b, 0xd1, 0xbe, 0x17, 0xb8, 0x02, 0x4e, + 0xf5, 0x05, 0x4d, 0xaf, 0x33, 0x70, 0x4a, 0x0a, 0x62, 0xc5, 0x13, 0x05, 0x65, 0x34, 0x53, 0x3c, + 0xcd, 0x85, 0x48, 0x2a, 0x5d, 0xc2, 0x17, 0x6e, 0x9c, 0x7a, 0x81, 0xab, 0x8b, 0xa3, 0x71, 0x43, + 0xd8, 0xc2, 0x92, 0x63, 0x3f, 0x0b, 0x32, 0x50, 0xd2, 0xe1, 0x30, 0xe6, 0x73, 0x0e, 0x87, 0x31, + 0xc7, 0x92, 0x63, 0xff, 0xb1, 0x04, 0xf2, 0x8b, 0x05, 0xec, 0x16, 0xbd, 0x8b, 0x35, 0x0b, 0xbb, + 0x4d, 0xe3, 0xd1, 0x85, 0xc7, 0x19, 0x27, 0x31, 0xff, 0x9e, 0xc7, 0x4f, 0x0e, 0x08, 0xe3, 0x98, + 0x3a, 0xd4, 0x1b, 0x51, 0x57, 0x3a, 0x5b, 0x6d, 0x3f, 0xa5, 0x17, 0x3c, 0xde, 0x5d, 0x24, 0x84, + 0x17, 0xaf, 0x45, 0xb7, 0xe1, 0x51, 0x97, 0xfa, 0xde, 0x88, 0xc6, 0xdb, 0xbe, 0xbf, 0x3d, 0x22, + 0x9e, 0x4f, 0x8e, 0x75, 0x93, 0x56, 0x6d, 0x3f, 0xa9, 0x55, 0x3e, 0xda, 0x99, 0x17, 0xc1, 0x8b, + 0xd6, 0xa1, 0x6d, 0x58, 0x97, 0x76, 0xb6, 0x79, 0x97, 0x7e, 0x30, 0xa4, 0x81, 0xae, 0xff, 0xb5, + 0xf6, 0x13, 0x5a, 0xd5, 0x7a, 0x77, 0x96, 0x8d, 0xf3, 0xf2, 0xa2, 0xba, 0x69, 0x92, 0xac, 0xd6, + 0xe5, 0xd9, 0xea, 0xd6, 0x4d, 0x59, 0x38, 0x2b, 0x27, 0x20, 0x50, 0xe6, 0xb5, 0x43, 0x7d, 0x4e, + 0x64, 0xa5, 0xcf, 0x40, 0xa0, 0x6e, 0x8e, 0x8f, 0xe7, 0x56, 0x88, 0x23, 0xe0, 0x0e, 0x63, 0x19, + 0x82, 0x15, 0x19, 0x02, 0x73, 0x04, 0x3a, 0x8a, 0x8c, 0x13, 0xbe, 0x00, 0x69, 0x8e, 0x3f, 0x64, + 0x9c, 0xc6, 0x7b, 0xae, 0xae, 0xc1, 0x06, 0x22, 0xec, 0x24, 0x0c, 0x9c, 0xca, 0x88, 0x74, 0xef, + 0xf8, 0x9e, 0x00, 0x24, 0x6e, 0xbd, 0x26, 0xe5, 0x4d, 0xba, 0xdf, 0xd1, 0x74, 0x6c, 0x24, 0x4c, + 0xbb, 0x00, 0x8b, 0xdb, 0x05, 0x71, 0x60, 0xd2, 0xab, 0x6e, 0xff, 0xb9, 0x04, 0x70, 0x18, 0xba, + 0xb4, 0xcb, 0x09, 0x1f, 0x32, 0xb4, 0x09, 0x05, 0xcf, 0xd5, 0x07, 0x09, 0xf4, 0xd2, 0xc2, 0x5e, + 0x07, 0x17, 0x3c, 0xd7, 0x64, 0xec, 0xc2, 0x99, 0x19, 0xfb, 0x25, 0x58, 0x75, 0x3d, 0x16, 0xf9, + 0x64, 0x2c, 0x88, 0xfa, 0x8c, 0x9b, 0x1d, 0xe8, 0xa4, 0x2c, 0x9c, 0x95, 0x33, 0x1e, 0x97, 0xce, + 0xf0, 0x38, 0x74, 0x69, 0x26, 0x39, 0xbd, 0x00, 0xe5, 0xe8, 0x84, 0xb0, 0x64, 0x83, 0x13, 0x7c, + 0x59, 0x3e, 0x12, 0xc4, 0x07, 0xa2, 0x33, 0x0d, 0x5d, 0x2a, 0x5f, 0xb0, 0x12, 0x14, 0x20, 0x4e, + 0xee, 0x17, 0x75, 0xb7, 0xf9, 0xd2, 0x20, 0xae, 0x9b, 0x68, 0xc2, 0xa9, 0x52, 0xd4, 0x13, 0xc0, + 0x6a, 0x10, 0xf9, 0x54, 0xd9, 0x58, 0xb9, 0x98, 0x8d, 0x0c, 0x12, 0x33, 0xba, 0x70, 0x56, 0x71, + 0xb6, 0x73, 0xa9, 0xfe, 0xef, 0xce, 0x05, 0xf9, 0xb0, 0xea, 0x13, 0x4e, 0x19, 0x97, 0x49, 0x5e, + 0x9e, 0x9b, 0xd5, 0x1b, 0xdf, 0x5d, 0xb2, 0xba, 0xb5, 0x6b, 0x22, 0xd2, 0xf2, 0x11, 0x67, 0xd5, + 0xdb, 0x1f, 0x95, 0xe1, 0x11, 0x4c, 0x15, 0xbe, 0x7e, 0xeb, 0xf8, 0x7d, 0xea, 0xf0, 0xd9, 0xe1, + 0x81, 0x75, 0x8e, 0xe1, 0xc1, 0x8f, 0xa1, 0xe2, 0x93, 0x63, 0xea, 0x8b, 0xaa, 0x20, 0x10, 0xe6, + 0x3b, 0x17, 0x77, 0x76, 0xd6, 0x95, 0xe6, 0x81, 0x54, 0xab, 0xf0, 0xe5, 0x23, 0xda, 0x87, 0x8a, + 0x22, 0x62, 0x6d, 0x13, 0xfd, 0x14, 0x20, 0x22, 0x31, 0x19, 0x50, 0x09, 0x94, 0x4a, 0xd2, 0x83, + 0xfd, 0xe5, 0x3d, 0x38, 0x4a, 0x74, 0xa6, 0xc0, 0xd6, 0x90, 0x18, 0xce, 0x98, 0x44, 0x9f, 0x58, + 0xb0, 0xd1, 0xcf, 0x95, 0x1f, 0x3d, 0x26, 0x5a, 0x02, 0xd8, 0xe6, 0x0b, 0x5a, 0x9a, 0xd4, 0xf2, + 0x1c, 0x3c, 0x67, 0x1d, 0xc5, 0xa6, 0x17, 0xab, 0x2c, 0xeb, 0x47, 0x7e, 0xae, 0x98, 0xee, 0xc3, + 0x6c, 0x73, 0xb6, 0xf9, 0x2d, 0x58, 0xcd, 0x6c, 0xd7, 0x43, 0x81, 0xe9, 0xdf, 0x59, 0x70, 0x6d, + 0x2e, 0xee, 0xc8, 0x87, 0x22, 0x8b, 0x1d, 0xdd, 0xb4, 0xbf, 0x7d, 0x89, 0x3b, 0xaa, 0x1c, 0x57, + 0x43, 0xbe, 0x6e, 0xec, 0x60, 0x61, 0x46, 0x24, 0x49, 0x97, 0x32, 0x9e, 0x4f, 0x92, 0x1d, 0xca, + 0x38, 0x96, 0x1c, 0xfb, 0x67, 0x16, 0x3c, 0x71, 0x86, 0x2e, 0x81, 0x36, 0xa4, 0x1b, 0x79, 0xb4, + 0xa1, 0x6e, 0x9c, 0xe2, 0x19, 0x24, 0x53, 0x38, 0x73, 0x62, 0xd4, 0x98, 0x9d, 0x01, 0xd5, 0xf2, + 0xf3, 0x1f, 0x7b, 0x1d, 0xae, 0x62, 0xca, 0xe3, 0x71, 0x97, 0xc7, 0x84, 0xd3, 0xfe, 0xd8, 0xfe, + 0x7b, 0x01, 0x20, 0x1d, 0xd1, 0x26, 0x73, 0x3c, 0x6b, 0xf1, 0x1c, 0x0f, 0xdd, 0x4d, 0xdc, 0x54, + 0x2e, 0xbc, 0x36, 0xe3, 0xe6, 0x83, 0x49, 0xa3, 0x95, 0x19, 0x9d, 0x0f, 0xbc, 0xc0, 0x0b, 0xd5, + 0xbf, 0xcf, 0xf7, 0xc3, 0xe6, 0x61, 0xc8, 0xbd, 0x9e, 0xa7, 0xce, 0x40, 0x3a, 0x91, 0xd0, 0x5f, + 0xd6, 0x83, 0x8a, 0x6a, 0x1c, 0x34, 0x2e, 0x6c, 0x2f, 0x33, 0x6f, 0xd6, 0x88, 0x5f, 0x0e, 0x00, + 0xd4, 0x33, 0xd6, 0xda, 0x91, 0x0f, 0x55, 0x76, 0xb3, 0x3d, 0x74, 0x4e, 0x29, 0xd7, 0x50, 0x7c, + 0x29, 0x4b, 0x4a, 0x53, 0x7b, 0x4d, 0x14, 0xe4, 0xe4, 0x0d, 0x1b, 0x0b, 0xf6, 0xa4, 0x00, 0x86, + 0x2c, 0x6a, 0x39, 0x0d, 0xdc, 0x28, 0xf4, 0xcc, 0x26, 0x9b, 0x5a, 0xbe, 0xab, 0xe9, 0xd8, 0x48, + 0xa0, 0x67, 0xa0, 0x72, 0xac, 0xdc, 0x54, 0x91, 0x36, 0x97, 0x46, 0x1b, 0xd1, 0x5c, 0x21, 0x17, + 0xd3, 0x7e, 0x3a, 0x74, 0x31, 0x72, 0x58, 0x52, 0xb1, 0xe6, 0x0a, 0xeb, 0x5e, 0xc0, 0xa8, 0x33, + 0x8c, 0x55, 0xb5, 0xad, 0xa6, 0xd6, 0xf7, 0x34, 0x1d, 0x1b, 0x09, 0x84, 0xa1, 0x46, 0x1c, 0x87, + 0x32, 0xb6, 0x4f, 0xc7, 0x3a, 0x13, 0x7d, 0x2d, 0x53, 0xd3, 0x9a, 0x4e, 0x18, 0x53, 0x51, 0xc1, + 0xba, 0xd4, 0x89, 0x29, 0xdf, 0xa7, 0xe3, 0x2e, 0xf5, 0xa9, 0xc3, 0xc3, 0x58, 0x8d, 0x20, 0xb6, + 0x93, 0xb5, 0x38, 0x55, 0x23, 0x74, 0xb2, 0x44, 0x5c, 0x67, 0x95, 0x87, 0xd1, 0x69, 0xc8, 0x38, + 0x55, 0x63, 0xbf, 0x2b, 0xe2, 0xab, 0xdb, 0xca, 0x67, 0xa0, 0x12, 0xc5, 0xb4, 0xe7, 0xdd, 0xd7, + 0xd1, 0x35, 0x91, 0x38, 0x92, 0x54, 0xac, 0xb9, 0x42, 0x8e, 0x0d, 0x7b, 0x42, 0x2e, 0x17, 0xd9, + 0xae, 0xa4, 0x62, 0xcd, 0xb5, 0xff, 0x54, 0x80, 0x4a, 0x57, 0xee, 0x38, 0xba, 0x07, 0x55, 0x51, + 0xb3, 0x65, 0x03, 0xa7, 0xb2, 0xc9, 0x0b, 0xe7, 0xab, 0xf0, 0xaa, 0x0a, 0xdd, 0xa6, 0x9c, 0xa4, + 0x45, 0x20, 0xa5, 0x61, 0xa3, 0x15, 0xf5, 0xa0, 0xc4, 0x22, 0xea, 0x2c, 0xdf, 0xf1, 0x2a, 0x8f, + 0xbb, 0x11, 0x75, 0xd2, 0xfc, 0x20, 0xde, 0xb0, 0xd4, 0x8f, 0x02, 0xa8, 0x30, 0x89, 0xf7, 0x96, + 0x6f, 0x7a, 0xb5, 0x25, 0xa9, 0x2d, 0x13, 0x44, 0xf9, 0x8e, 0xb5, 0x15, 0xfb, 0xaf, 0x16, 0x80, + 0x12, 0x3c, 0xf0, 0x98, 0xe8, 0x82, 0xf3, 0x81, 0x6c, 0x9e, 0x2f, 0x90, 0x62, 0xb5, 0x0c, 0xa3, + 0x39, 0xb5, 0x09, 0x25, 0x13, 0x44, 0x0a, 0x65, 0x8f, 0xd3, 0x01, 0xab, 0x17, 0x64, 0x0d, 0x7f, + 0x6d, 0xd9, 0x6f, 0x4b, 0xb3, 0xf0, 0x9e, 0x50, 0x8b, 0x95, 0x76, 0x7b, 0x52, 0x4c, 0xbe, 0x49, + 0x04, 0x16, 0xfd, 0xca, 0x82, 0x35, 0x37, 0x99, 0x71, 0x78, 0x34, 0xf9, 0x5d, 0x63, 0xef, 0xd2, + 0x46, 0x2d, 0xed, 0xff, 0xd3, 0x6e, 0x5c, 0x9b, 0x65, 0x78, 0x94, 0xe1, 0x19, 0xcb, 0x28, 0x84, + 0x2a, 0x8f, 0xbd, 0x7e, 0x5f, 0xe0, 0x18, 0x15, 0x83, 0xed, 0x25, 0x66, 0x27, 0x4a, 0x53, 0x1a, + 0x71, 0x4d, 0x60, 0xd8, 0x18, 0x41, 0xfb, 0x00, 0x2e, 0x8d, 0xfc, 0x70, 0x2c, 0x22, 0xa1, 0x8f, + 0xd4, 0x93, 0x8b, 0x2e, 0xf5, 0x51, 0xe8, 0xca, 0x33, 0xf9, 0x88, 0xb8, 0x01, 0x1d, 0xb3, 0x04, + 0x67, 0x96, 0xa3, 0x5f, 0x5a, 0xb0, 0x21, 0x9a, 0x03, 0xc2, 0x9d, 0x93, 0x64, 0x34, 0xa1, 0x93, + 0xf4, 0xeb, 0x4b, 0x06, 0x33, 0x51, 0xd7, 0xbe, 0x36, 0x9d, 0x34, 0x66, 0x27, 0x25, 0x78, 0xce, + 0xa6, 0xfd, 0xef, 0x12, 0xac, 0x65, 0x4f, 0x77, 0xda, 0x78, 0x58, 0xe7, 0x6d, 0x3c, 0xbe, 0x9f, + 0x6d, 0x3c, 0xd4, 0xa5, 0xfe, 0xc6, 0xf9, 0x4e, 0xfa, 0x39, 0x7a, 0x0e, 0x32, 0xdb, 0x73, 0x14, + 0x1f, 0x5a, 0xfd, 0x43, 0xb5, 0x1b, 0xa5, 0x2f, 0x69, 0x37, 0x46, 0x50, 0x0e, 0x42, 0x97, 0xb2, + 0x7a, 0x59, 0x9e, 0xb8, 0xb7, 0x2f, 0x27, 0xa3, 0x34, 0x45, 0x48, 0x35, 0x70, 0x37, 0xd7, 0x50, + 0xd2, 0xb0, 0x32, 0x87, 0xb6, 0x61, 0x5d, 0x7b, 0xec, 0x85, 0xc1, 0x4e, 0x38, 0x0c, 0x54, 0x87, + 0x57, 0x4e, 0xe7, 0x06, 0x3b, 0xb3, 0x6c, 0x9c, 0x97, 0xdf, 0xfc, 0x89, 0xea, 0x80, 0xcf, 0x04, + 0x9c, 0xef, 0x66, 0x01, 0xe7, 0x52, 0x69, 0x39, 0x6d, 0xb4, 0xb3, 0xb0, 0x75, 0x6a, 0x01, 0xa4, + 0x23, 0x4a, 0x81, 0x01, 0xe5, 0x26, 0xe7, 0x31, 0xa0, 0x3c, 0x04, 0x58, 0xf1, 0x04, 0x06, 0x64, + 0x3c, 0x8c, 0xf2, 0x18, 0xb0, 0xcb, 0xc3, 0x08, 0x4b, 0xce, 0xe2, 0x39, 0x79, 0xf1, 0x2b, 0xfb, + 0x89, 0xef, 0x2f, 0x05, 0x58, 0xd1, 0xa9, 0xe3, 0x1c, 0xa3, 0xdf, 0x18, 0xaa, 0xb1, 0x86, 0xc8, + 0x3a, 0xea, 0x6f, 0x5c, 0x56, 0x33, 0xa8, 0x60, 0x5a, 0x42, 0xc3, 0xc6, 0xce, 0x43, 0xfc, 0x2a, + 0x88, 0x3e, 0xb4, 0xe0, 0x6a, 0x4c, 0x23, 0xdf, 0xe0, 0xe7, 0xe5, 0x13, 0xd4, 0x0c, 0x1c, 0x57, + 0x09, 0x6a, 0x86, 0x84, 0x67, 0x0d, 0xda, 0xbf, 0x2f, 0x40, 0xf1, 0x0e, 0xde, 0x93, 0x38, 0xc6, + 0x39, 0xa1, 0x26, 0x9a, 0x69, 0x09, 0x96, 0x54, 0xac, 0xb9, 0x22, 0xe6, 0x43, 0x46, 0xe3, 0xfc, + 0x81, 0xb9, 0xc3, 0x68, 0x8c, 0x25, 0x47, 0x60, 0xc3, 0x88, 0x30, 0xf6, 0xc3, 0x30, 0x4e, 0xa6, + 0x93, 0x26, 0xe7, 0x1f, 0x69, 0x3a, 0x36, 0x12, 0x42, 0xdf, 0x49, 0xc8, 0xb8, 0xce, 0x0b, 0xe9, + 0x88, 0x37, 0x14, 0x7d, 0x8e, 0xe0, 0x98, 0xf9, 0x65, 0x59, 0x5e, 0xc7, 0x05, 0xf3, 0x4b, 0xd3, + 0xc8, 0x54, 0xce, 0x6c, 0x64, 0x9e, 0x86, 0xf2, 0x07, 0x43, 0x1a, 0x8f, 0xe5, 0x44, 0x25, 0x73, + 0x17, 0xde, 0x16, 0x44, 0xac, 0x78, 0xc2, 0xf1, 0x5e, 0x4c, 0xfa, 0x03, 0xd1, 0x90, 0x54, 0x67, + 0x1d, 0xbf, 0xa5, 0xe9, 0xd8, 0x48, 0xd8, 0x0e, 0xac, 0x66, 0xfe, 0x44, 0xe3, 0x1c, 0x3f, 0xbf, + 0xdf, 0x00, 0x18, 0xd1, 0xd8, 0xeb, 0x8d, 0x77, 0x68, 0xcc, 0xf5, 0xc8, 0xd4, 0xc0, 0xb8, 0xbb, + 0x86, 0x83, 0x33, 0x52, 0xed, 0xe6, 0xa7, 0x5f, 0x6c, 0x5d, 0xf9, 0xec, 0x8b, 0xad, 0x2b, 0x9f, + 0x7f, 0xb1, 0x75, 0xe5, 0xc3, 0xe9, 0x96, 0xf5, 0xe9, 0x74, 0xcb, 0xfa, 0x6c, 0xba, 0x65, 0x7d, + 0x3e, 0xdd, 0xb2, 0xfe, 0x39, 0xdd, 0xb2, 0x3e, 0xf9, 0xd7, 0xd6, 0x95, 0x77, 0xab, 0xc9, 0xee, + 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0x34, 0x35, 0x92, 0x9e, 0xf0, 0x24, 0x00, 0x00, } diff --git a/pkg/apis/sensor/v1alpha1/generated.proto b/pkg/apis/sensor/v1alpha1/generated.proto index 12b1f4940a..633d1d4683 100644 --- a/pkg/apis/sensor/v1alpha1/generated.proto +++ b/pkg/apis/sensor/v1alpha1/generated.proto @@ -23,7 +23,6 @@ import "k8s.io/api/core/v1/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; -import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v1alpha1"; @@ -185,6 +184,18 @@ message EventDependencyFilter { optional Data data = 4; } +// EventProtocol contains configuration necessary to receieve an event from gateway over different communication protocols +message EventProtocol { + // Type defines the type of protocol over which events will be receieved + optional string type = 1; + + // Http contains the information required to setup a http server and listen to incoming events + optional Http http = 2; + + // Nats contains the information required to connect to nats server and get subscriptions + optional Nats nats = 3; +} + // FileArtifact contains information about an artifact in a filesystem message FileArtifact { optional string path = 1; @@ -200,6 +211,45 @@ message GroupVersionKind { optional string kind = 3; } +// Http contains the information required to setup a http server and listen to incoming events +message Http { + // Port on which server will run + optional string port = 1; +} + +// Nats contains the information required to connect to nats server and get subscriptions +message Nats { + // URL is nats server/service URL + optional string url = 1; + + // Subscribe starting with most recently published value. Refer https://github.com/nats-io/go-nats-streaming + optional bool startWithLastReceived = 2; + + // Receive all stored values in order. + optional bool deliverAllAvailable = 3; + + // Receive messages starting at a specific sequence number + optional string startAtSequence = 4; + + // Subscribe starting at a specific time + optional string startAtTime = 5; + + // Subscribe starting a specific amount of time in the past (e.g. 30 seconds ago) + optional string startAtTimeDelta = 6; + + // Durable subscriptions allow clients to assign a durable name to a subscription when it is created + optional bool durable = 7; + + // The NATS Streaming cluster ID + optional string clusterId = 8; + + // The NATS Streaming cluster ID + optional string clientId = 9; + + // Type of the connection. either standard or streaming + optional string type = 10; +} + // NodeStatus describes the status for an individual node in the sensor's FSM. // A single node can represent the status for event or a trigger. message NodeStatus { @@ -357,6 +407,9 @@ message SensorSpec { // DeploySpec contains sensor pod specification. For more information, read https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.11/#pod-v1-core optional k8s.io.api.core.v1.PodSpec deploySpec = 3; + + // EventProtocol is the protocol through which sensor receives events from gateway + optional EventProtocol dispatchProtocol = 4; } // SensorStatus contains information about the status of a sensor. diff --git a/pkg/apis/sensor/v1alpha1/openapi_generated.go b/pkg/apis/sensor/v1alpha1/openapi_generated.go index 2edbf7c882..ae24eca86f 100644 --- a/pkg/apis/sensor/v1alpha1/openapi_generated.go +++ b/pkg/apis/sensor/v1alpha1/openapi_generated.go @@ -37,8 +37,11 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EventContext": schema_pkg_apis_sensor_v1alpha1_EventContext(ref), "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EventDependency": schema_pkg_apis_sensor_v1alpha1_EventDependency(ref), "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EventDependencyFilter": schema_pkg_apis_sensor_v1alpha1_EventDependencyFilter(ref), + "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EventProtocol": schema_pkg_apis_sensor_v1alpha1_EventProtocol(ref), "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.FileArtifact": schema_pkg_apis_sensor_v1alpha1_FileArtifact(ref), "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.GroupVersionKind": schema_pkg_apis_sensor_v1alpha1_GroupVersionKind(ref), + "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.Http": schema_pkg_apis_sensor_v1alpha1_Http(ref), + "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.Nats": schema_pkg_apis_sensor_v1alpha1_Nats(ref), "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.NodeStatus": schema_pkg_apis_sensor_v1alpha1_NodeStatus(ref), "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.ResourceObject": schema_pkg_apis_sensor_v1alpha1_ResourceObject(ref), "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.ResourceParameter": schema_pkg_apis_sensor_v1alpha1_ResourceParameter(ref), @@ -63,6 +66,7 @@ func schema_pkg_apis_sensor_v1alpha1_ArtifactLocation(ref common.ReferenceCallba Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "ArtifactLocation describes the source location for an external artifact", + Type: []string{"object"}, Properties: map[string]spec.Schema{ "s3": { SchemaProps: spec.SchemaProps{ @@ -103,6 +107,7 @@ func schema_pkg_apis_sensor_v1alpha1_ConfigmapArtifact(ref common.ReferenceCallb Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "ConfigmapArtifact contains information about artifact in k8 configmap", + Type: []string{"object"}, Properties: map[string]spec.Schema{ "name": { SchemaProps: spec.SchemaProps{ @@ -137,6 +142,7 @@ func schema_pkg_apis_sensor_v1alpha1_Data(ref common.ReferenceCallback) common.O return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, Properties: map[string]spec.Schema{ "filters": { SchemaProps: spec.SchemaProps{ @@ -171,6 +177,7 @@ func schema_pkg_apis_sensor_v1alpha1_DataFilter(ref common.ReferenceCallback) co Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "DataFilter describes constraints and filters for event data Regular Expressions are purposefully not a feature as they are overkill for our uses here See Rob Pike's Post: https://commandcenter.blogspot.com/2011/08/regular-expressions-in-lexing-and.html", + Type: []string{"object"}, Properties: map[string]spec.Schema{ "path": { SchemaProps: spec.SchemaProps{ @@ -213,6 +220,7 @@ func schema_pkg_apis_sensor_v1alpha1_EscalationPolicy(ref common.ReferenceCallba Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "EscalationPolicy describes the policy for escalating sensors in an Error state. An escalation policy is associated with event filter. Whenever a event filter fails escalation will be triggered", + Type: []string{"object"}, Properties: map[string]spec.Schema{ "name": { SchemaProps: spec.SchemaProps{ @@ -248,6 +256,7 @@ func schema_pkg_apis_sensor_v1alpha1_Event(ref common.ReferenceCallback) common. Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "Event is a data record expressing an occurrence and its context. Adheres to the CloudEvents v0.1 specification", + Type: []string{"object"}, Properties: map[string]spec.Schema{ "context": { SchemaProps: spec.SchemaProps{ @@ -274,6 +283,7 @@ func schema_pkg_apis_sensor_v1alpha1_EventContext(ref common.ReferenceCallback) Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "EventContext contains metadata that provides circumstantial information about the occurrence.", + Type: []string{"object"}, Properties: map[string]spec.Schema{ "eventType": { SchemaProps: spec.SchemaProps{ @@ -356,6 +366,7 @@ func schema_pkg_apis_sensor_v1alpha1_EventDependency(ref common.ReferenceCallbac Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "EventDependency describes a dependency", + Type: []string{"object"}, Properties: map[string]spec.Schema{ "name": { SchemaProps: spec.SchemaProps{ @@ -391,6 +402,7 @@ func schema_pkg_apis_sensor_v1alpha1_EventDependencyFilter(ref common.ReferenceC Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "EventDependencyFilter defines filters and constraints for a event.", + Type: []string{"object"}, Properties: map[string]spec.Schema{ "name": { SchemaProps: spec.SchemaProps{ @@ -426,11 +438,47 @@ func schema_pkg_apis_sensor_v1alpha1_EventDependencyFilter(ref common.ReferenceC } } +func schema_pkg_apis_sensor_v1alpha1_EventProtocol(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "EventProtocol contains configuration necessary to receieve an event from gateway over different communication protocols", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "type": { + SchemaProps: spec.SchemaProps{ + Description: "Type defines the type of protocol over which events will be receieved", + Type: []string{"string"}, + Format: "", + }, + }, + "http": { + SchemaProps: spec.SchemaProps{ + Description: "Http contains the information required to setup a http server and listen to incoming events", + Ref: ref("github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.Http"), + }, + }, + "nats": { + SchemaProps: spec.SchemaProps{ + Description: "Nats contains the information required to connect to nats server and get subscriptions", + Ref: ref("github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.Nats"), + }, + }, + }, + Required: []string{"type", "http", "nats"}, + }, + }, + Dependencies: []string{ + "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.Http", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.Nats"}, + } +} + func schema_pkg_apis_sensor_v1alpha1_FileArtifact(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "FileArtifact contains information about an artifact in a filesystem", + Type: []string{"object"}, Properties: map[string]spec.Schema{ "path": { SchemaProps: spec.SchemaProps{ @@ -450,6 +498,7 @@ func schema_pkg_apis_sensor_v1alpha1_GroupVersionKind(ref common.ReferenceCallba Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "GroupVersionKind unambiguously identifies a kind. It doesn't anonymously include GroupVersion to avoid automatic coercion. It doesn't use a GroupVersion to avoid custom marshalling.", + Type: []string{"object"}, Properties: map[string]spec.Schema{ "group": { SchemaProps: spec.SchemaProps{ @@ -477,11 +526,119 @@ func schema_pkg_apis_sensor_v1alpha1_GroupVersionKind(ref common.ReferenceCallba } } +func schema_pkg_apis_sensor_v1alpha1_Http(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "Http contains the information required to setup a http server and listen to incoming events", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "port": { + SchemaProps: spec.SchemaProps{ + Description: "Port on which server will run", + Type: []string{"string"}, + Format: "", + }, + }, + }, + Required: []string{"port"}, + }, + }, + Dependencies: []string{}, + } +} + +func schema_pkg_apis_sensor_v1alpha1_Nats(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "Nats contains the information required to connect to nats server and get subscriptions", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "url": { + SchemaProps: spec.SchemaProps{ + Description: "URL is nats server/service URL", + Type: []string{"string"}, + Format: "", + }, + }, + "startWithLastReceived": { + SchemaProps: spec.SchemaProps{ + Description: "Subscribe starting with most recently published value. Refer https://github.com/nats-io/go-nats-streaming", + Type: []string{"boolean"}, + Format: "", + }, + }, + "deliverAllAvailable": { + SchemaProps: spec.SchemaProps{ + Description: "Receive all stored values in order.", + Type: []string{"boolean"}, + Format: "", + }, + }, + "startAtSequence": { + SchemaProps: spec.SchemaProps{ + Description: "Receive messages starting at a specific sequence number", + Type: []string{"string"}, + Format: "", + }, + }, + "startAtTime": { + SchemaProps: spec.SchemaProps{ + Description: "Subscribe starting at a specific time", + Type: []string{"string"}, + Format: "", + }, + }, + "startAtTimeDelta": { + SchemaProps: spec.SchemaProps{ + Description: "Subscribe starting a specific amount of time in the past (e.g. 30 seconds ago)", + Type: []string{"string"}, + Format: "", + }, + }, + "durable": { + SchemaProps: spec.SchemaProps{ + Description: "Durable subscriptions allow clients to assign a durable name to a subscription when it is created", + Type: []string{"boolean"}, + Format: "", + }, + }, + "clusterId": { + SchemaProps: spec.SchemaProps{ + Description: "The NATS Streaming cluster ID", + Type: []string{"string"}, + Format: "", + }, + }, + "clientId": { + SchemaProps: spec.SchemaProps{ + Description: "The NATS Streaming cluster ID", + Type: []string{"string"}, + Format: "", + }, + }, + "type": { + SchemaProps: spec.SchemaProps{ + Description: "Type of the connection. either standard or streaming", + Type: []string{"string"}, + Format: "", + }, + }, + }, + Required: []string{"url", "type"}, + }, + }, + Dependencies: []string{}, + } +} + func schema_pkg_apis_sensor_v1alpha1_NodeStatus(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "NodeStatus describes the status for an individual node in the sensor's FSM. A single node can represent the status for event or a trigger.", + Type: []string{"object"}, Properties: map[string]spec.Schema{ "id": { SchemaProps: spec.SchemaProps{ @@ -525,7 +682,7 @@ func schema_pkg_apis_sensor_v1alpha1_NodeStatus(ref common.ReferenceCallback) co Format: "", }, }, - "latestEvent": { + "event": { SchemaProps: spec.SchemaProps{ Description: "Event stores the last seen event for this node", Ref: ref("github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.Event"), @@ -545,6 +702,7 @@ func schema_pkg_apis_sensor_v1alpha1_ResourceObject(ref common.ReferenceCallback Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "ResourceObject is the resource object to create on kubernetes", + Type: []string{"object"}, Properties: map[string]spec.Schema{ "group": { SchemaProps: spec.SchemaProps{ @@ -618,6 +776,7 @@ func schema_pkg_apis_sensor_v1alpha1_ResourceParameter(ref common.ReferenceCallb Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "ResourceParameter indicates a passed parameter to a service template", + Type: []string{"object"}, Properties: map[string]spec.Schema{ "src": { SchemaProps: spec.SchemaProps{ @@ -646,6 +805,7 @@ func schema_pkg_apis_sensor_v1alpha1_ResourceParameterSource(ref common.Referenc Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "ResourceParameterSource defines the source for a resource parameter from a event event", + Type: []string{"object"}, Properties: map[string]spec.Schema{ "event": { SchemaProps: spec.SchemaProps{ @@ -681,6 +841,7 @@ func schema_pkg_apis_sensor_v1alpha1_RetryStrategy(ref common.ReferenceCallback) Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "RetryStrategy represents a strategy for retrying operations", + Type: []string{"object"}, Properties: map[string]spec.Schema{}, }, }, @@ -693,6 +854,7 @@ func schema_pkg_apis_sensor_v1alpha1_S3Artifact(ref common.ReferenceCallback) co Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "S3Artifact contains information about an artifact in S3", + Type: []string{"object"}, Properties: map[string]spec.Schema{ "key": { SchemaProps: spec.SchemaProps{ @@ -724,6 +886,7 @@ func schema_pkg_apis_sensor_v1alpha1_S3Bucket(ref common.ReferenceCallback) comm Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "S3Bucket contains information for an S3 Bucket", + Type: []string{"object"}, Properties: map[string]spec.Schema{ "endpoint": { SchemaProps: spec.SchemaProps{ @@ -761,6 +924,7 @@ func schema_pkg_apis_sensor_v1alpha1_S3Filter(ref common.ReferenceCallback) comm Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "S3Filter represents filters to apply to bucket nofifications for specifying constraints on objects", + Type: []string{"object"}, Properties: map[string]spec.Schema{ "prefix": { SchemaProps: spec.SchemaProps{ @@ -787,6 +951,7 @@ func schema_pkg_apis_sensor_v1alpha1_Sensor(ref common.ReferenceCallback) common Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "Sensor is the definition of a sensor resource", + Type: []string{"object"}, Properties: map[string]spec.Schema{ "spec": { SchemaProps: spec.SchemaProps{ @@ -812,6 +977,7 @@ func schema_pkg_apis_sensor_v1alpha1_SensorList(ref common.ReferenceCallback) co Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "SensorList is the list of Sensor resources", + Type: []string{"object"}, Properties: map[string]spec.Schema{ "items": { SchemaProps: spec.SchemaProps{ @@ -839,10 +1005,11 @@ func schema_pkg_apis_sensor_v1alpha1_SensorSpec(ref common.ReferenceCallback) co Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "SensorSpec represents desired sensor state", + Type: []string{"object"}, Properties: map[string]spec.Schema{ "dependencies": { SchemaProps: spec.SchemaProps{ - Description: "EventDependency is a list of the events that this sensor is dependent on.", + Description: "Dependencies is a list of the events that this sensor is dependent on.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ @@ -872,12 +1039,18 @@ func schema_pkg_apis_sensor_v1alpha1_SensorSpec(ref common.ReferenceCallback) co Ref: ref("k8s.io/api/core/v1.PodSpec"), }, }, + "eventProtocol": { + SchemaProps: spec.SchemaProps{ + Description: "EventProtocol is the protocol through which sensor receives events from gateway", + Ref: ref("github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EventProtocol"), + }, + }, }, - Required: []string{"dependencies", "triggers", "deploySpec"}, + Required: []string{"dependencies", "triggers", "deploySpec", "eventProtocol"}, }, }, Dependencies: []string{ - "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EventDependency", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.Trigger", "k8s.io/api/core/v1.PodSpec"}, + "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EventDependency", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EventProtocol", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.Trigger", "k8s.io/api/core/v1.PodSpec"}, } } @@ -886,6 +1059,7 @@ func schema_pkg_apis_sensor_v1alpha1_SensorStatus(ref common.ReferenceCallback) Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "SensorStatus contains information about the status of a sensor.", + Type: []string{"object"}, Properties: map[string]spec.Schema{ "phase": { SchemaProps: spec.SchemaProps{ @@ -894,6 +1068,18 @@ func schema_pkg_apis_sensor_v1alpha1_SensorStatus(ref common.ReferenceCallback) Format: "", }, }, + "startedAt": { + SchemaProps: spec.SchemaProps{ + Description: "StartedAt is the time at which this sensor was initiated", + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + }, + }, + "completedAt": { + SchemaProps: spec.SchemaProps{ + Description: "CompletedAt is the time at which this sensor was completed", + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.Time"), + }, + }, "completionCount": { SchemaProps: spec.SchemaProps{ Description: "CompletionCount is the count of sensor's successful runs.", @@ -926,7 +1112,7 @@ func schema_pkg_apis_sensor_v1alpha1_SensorStatus(ref common.ReferenceCallback) }, }, Dependencies: []string{ - "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.NodeStatus"}, + "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.NodeStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.Time"}, } } @@ -935,6 +1121,7 @@ func schema_pkg_apis_sensor_v1alpha1_TimeFilter(ref common.ReferenceCallback) co Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "TimeFilter describes a window in time. Filters out event events that occur outside the time limits. In other words, only events that occur after Start and before Stop will pass this filter.", + Type: []string{"object"}, Properties: map[string]spec.Schema{ "start": { SchemaProps: spec.SchemaProps{ @@ -969,6 +1156,7 @@ func schema_pkg_apis_sensor_v1alpha1_Trigger(ref common.ReferenceCallback) commo Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "Trigger is an action taken, output produced, an event created, a message sent", + Type: []string{"object"}, Properties: map[string]spec.Schema{ "name": { SchemaProps: spec.SchemaProps{ @@ -1010,6 +1198,7 @@ func schema_pkg_apis_sensor_v1alpha1_URI(ref common.ReferenceCallback) common.Op Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "URI is a Uniform Resource Identifier based on RFC 3986", + Type: []string{"object"}, Properties: map[string]spec.Schema{ "scheme": { SchemaProps: spec.SchemaProps{ @@ -1072,6 +1261,7 @@ func schema_pkg_apis_sensor_v1alpha1_URLArtifact(ref common.ReferenceCallback) c Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ Description: "URLArtifact contains information about an artifact at an http endpoint.", + Type: []string{"object"}, Properties: map[string]spec.Schema{ "path": { SchemaProps: spec.SchemaProps{ diff --git a/pkg/apis/sensor/v1alpha1/types.go b/pkg/apis/sensor/v1alpha1/types.go index e6364ef039..fda6ac112a 100644 --- a/pkg/apis/sensor/v1alpha1/types.go +++ b/pkg/apis/sensor/v1alpha1/types.go @@ -25,6 +25,15 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1" ) +// EventProtocolType is type of the event dispatch protocol. Used for dispatching events +type EventProtocolType string + +// possible types of event dispatch protocol +const ( + HTTP EventProtocolType = "HTTP" + NATS EventProtocolType = "NATS" +) + type NotificationType string const ( @@ -52,6 +61,15 @@ const ( NodePhaseNew NodePhase = "" // the node is new ) +// Type of nats connection. +type NatsType string + +// possible values of nats connection type +const ( + Standard NatsType = "Standard" + Streaming NatsType = "Streaming" +) + // Sensor is the definition of a sensor resource // +genclient // +genclient:noStatus @@ -78,14 +96,68 @@ type SensorList struct { // SensorSpec represents desired sensor state type SensorSpec struct { - // EventDependency is a list of the events that this sensor is dependent on. - EventDependencies []EventDependency `json:"dependencies" protobuf:"bytes,1,rep,name=dependencies"` + // Dependencies is a list of the events that this sensor is dependent on. + Dependencies []EventDependency `json:"dependencies" protobuf:"bytes,1,rep,name=dependencies"` // Triggers is a list of the things that this sensor evokes. These are the outputs from this sensor. Triggers []Trigger `json:"triggers" protobuf:"bytes,2,rep,name=triggers"` // DeploySpec contains sensor pod specification. For more information, read https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.11/#pod-v1-core DeploySpec *corev1.PodSpec `json:"deploySpec" protobuf:"bytes,3,opt,name=deploySpec"` + + // EventProtocol is the protocol through which sensor receives events from gateway + EventProtocol *EventProtocol `json:"eventProtocol" protobuf:"bytes,4,opt,name=eventProtocol"` +} + +// EventProtocol contains configuration necessary to receieve an event from gateway over different communication protocols +type EventProtocol struct { + // Type defines the type of protocol over which events will be receieved + Type EventProtocolType `json:"type" protobuf:"bytes,1,opt,name=type"` + + // Http contains the information required to setup a http server and listen to incoming events + Http Http `json:"http" protobuf:"bytes,2,opt,name=http"` + + // Nats contains the information required to connect to nats server and get subscriptions + Nats Nats `json:"nats" protobuf:"bytes,3,opt,name=nats"` +} + +// Http contains the information required to setup a http server and listen to incoming events +type Http struct { + // Port on which server will run + Port string `json:"port" protobuf:"bytes,1,opt,name=port"` +} + +// Nats contains the information required to connect to nats server and get subscriptions +type Nats struct { + // URL is nats server/service URL + URL string `json:"url" protobuf:"bytes,1,opt,name=url"` + + // Subscribe starting with most recently published value. Refer https://github.com/nats-io/go-nats-streaming + StartWithLastReceived bool `json:"startWithLastReceived,omitempty" protobuf:"bytes,2,opt,name=startWithLastReceived"` + + // Receive all stored values in order. + DeliverAllAvailable bool `json:"deliverAllAvailable,omitempty" protobuf:"bytes,3,opt,name=deliverAllAvailable"` + + // Receive messages starting at a specific sequence number + StartAtSequence string `json:"startAtSequence,omitempty" protobuf:"bytes,4,opt,name=startAtSequence"` + + // Subscribe starting at a specific time + StartAtTime string `json:"startAtTime,omitempty" protobuf:"bytes,5,opt,name=startAtTime"` + + // Subscribe starting a specific amount of time in the past (e.g. 30 seconds ago) + StartAtTimeDelta string `json:"startAtTimeDelta,omitempty" protobuf:"bytes,6,opt,name=startAtTimeDelta"` + + // Durable subscriptions allow clients to assign a durable name to a subscription when it is created + Durable bool `json:"durable,omitempty" protobuf:"bytes,7,opt,name=durable"` + + // The NATS Streaming cluster ID + ClusterId string `json:"clusterId,omitempty" protobuf:"bytes,8,opt,name=clusterId"` + + // The NATS Streaming cluster ID + ClientId string `json:"clientId,omitempty" protobuf:"bytes,9,opt,name=clientId"` + + // Type of the connection. either standard or streaming + Type NatsType `json:"type" protobuf:"bytes,10,opt,name=type"` } // EventDependency describes a dependency @@ -102,6 +174,9 @@ type EventDependency struct { // Filters and rules governing tolerations of success and constraints on the context and data of an event Filters EventDependencyFilter `json:"filters,omitempty" protobuf:"bytes,3,opt,name=filters"` + + // Connected tells if subscription is already setup in case of nats protocol. + Connected bool `json:"connected,omitempty" protobuf:"bytes,4,opt,name=connected"` } // GroupVersionKind unambiguously identifies a kind. It doesn't anonymously include GroupVersion @@ -292,11 +367,9 @@ type SensorStatus struct { Phase NodePhase `json:"phase" protobuf:"bytes,1,opt,name=phase"` // StartedAt is the time at which this sensor was initiated - // +k8s:openapi-gen=false StartedAt v1.Time `json:"startedAt,omitempty" protobuf:"bytes,2,opt,name=startedAt"` // CompletedAt is the time at which this sensor was completed - // +k8s:openapi-gen=false CompletedAt v1.Time `json:"completedAt,omitempty" protobuf:"bytes,3,opt,name=completedAt"` // CompletionCount is the count of sensor's successful runs. @@ -341,7 +414,7 @@ type NodeStatus struct { Message string `json:"message,omitempty" protobuf:"bytes,8,opt,name=message"` // Event stores the last seen event for this node - Event *Event `json:"latestEvent,omitempty" protobuf:"bytes,9,opt,name=latestEvent"` + Event *Event `json:"event,omitempty" protobuf:"bytes,9,opt,name=event"` } // Event is a data record expressing an occurrence and its context. diff --git a/pkg/apis/sensor/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/sensor/v1alpha1/zz_generated.deepcopy.go index 715b71889f..ecca437c40 100644 --- a/pkg/apis/sensor/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/sensor/v1alpha1/zz_generated.deepcopy.go @@ -259,6 +259,24 @@ func (in *EventDependencyFilter) DeepCopy() *EventDependencyFilter { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EventProtocol) DeepCopyInto(out *EventProtocol) { + *out = *in + out.Http = in.Http + out.Nats = in.Nats + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EventProtocol. +func (in *EventProtocol) DeepCopy() *EventProtocol { + if in == nil { + return nil + } + out := new(EventProtocol) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *FileArtifact) DeepCopyInto(out *FileArtifact) { *out = *in @@ -291,6 +309,38 @@ func (in *GroupVersionKind) DeepCopy() *GroupVersionKind { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Http) DeepCopyInto(out *Http) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Http. +func (in *Http) DeepCopy() *Http { + if in == nil { + return nil + } + out := new(Http) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Nats) DeepCopyInto(out *Nats) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Nats. +func (in *Nats) DeepCopy() *Nats { + if in == nil { + return nil + } + out := new(Nats) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *NodeStatus) DeepCopyInto(out *NodeStatus) { *out = *in @@ -536,8 +586,8 @@ func (in *SensorList) DeepCopyObject() runtime.Object { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *SensorSpec) DeepCopyInto(out *SensorSpec) { *out = *in - if in.EventDependencies != nil { - in, out := &in.EventDependencies, &out.EventDependencies + if in.Dependencies != nil { + in, out := &in.Dependencies, &out.Dependencies *out = make([]EventDependency, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) @@ -555,6 +605,11 @@ func (in *SensorSpec) DeepCopyInto(out *SensorSpec) { *out = new(v1.PodSpec) (*in).DeepCopyInto(*out) } + if in.EventProtocol != nil { + in, out := &in.EventProtocol, &out.EventProtocol + *out = new(EventProtocol) + **out = **in + } return } diff --git a/pkg/client/gateway/clientset/versioned/clientset.go b/pkg/client/gateway/clientset/versioned/clientset.go index 3635c5361f..8efafc8023 100644 --- a/pkg/client/gateway/clientset/versioned/clientset.go +++ b/pkg/client/gateway/clientset/versioned/clientset.go @@ -19,7 +19,6 @@ package versioned import ( argoprojv1alpha1 "github.com/argoproj/argo-events/pkg/client/gateway/clientset/versioned/typed/gateway/v1alpha1" - glog "github.com/golang/glog" discovery "k8s.io/client-go/discovery" rest "k8s.io/client-go/rest" flowcontrol "k8s.io/client-go/util/flowcontrol" @@ -73,7 +72,6 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { cs.DiscoveryClient, err = discovery.NewDiscoveryClientForConfig(&configShallowCopy) if err != nil { - glog.Errorf("failed to create the DiscoveryClient: %v", err) return nil, err } return &cs, nil diff --git a/pkg/client/gateway/clientset/versioned/fake/clientset_generated.go b/pkg/client/gateway/clientset/versioned/fake/clientset_generated.go index 6bb4498314..34a59f276d 100644 --- a/pkg/client/gateway/clientset/versioned/fake/clientset_generated.go +++ b/pkg/client/gateway/clientset/versioned/fake/clientset_generated.go @@ -40,9 +40,10 @@ func NewSimpleClientset(objects ...runtime.Object) *Clientset { } } - fakePtr := testing.Fake{} - fakePtr.AddReactor("*", "*", testing.ObjectReaction(o)) - fakePtr.AddWatchReactor("*", func(action testing.Action) (handled bool, ret watch.Interface, err error) { + cs := &Clientset{} + cs.discovery = &fakediscovery.FakeDiscovery{Fake: &cs.Fake} + cs.AddReactor("*", "*", testing.ObjectReaction(o)) + cs.AddWatchReactor("*", func(action testing.Action) (handled bool, ret watch.Interface, err error) { gvr := action.GetResource() ns := action.GetNamespace() watch, err := o.Watch(gvr, ns) @@ -52,7 +53,7 @@ func NewSimpleClientset(objects ...runtime.Object) *Clientset { return true, watch, nil }) - return &Clientset{fakePtr, &fakediscovery.FakeDiscovery{Fake: &fakePtr}} + return cs } // Clientset implements clientset.Interface. Meant to be embedded into a diff --git a/pkg/client/gateway/clientset/versioned/fake/register.go b/pkg/client/gateway/clientset/versioned/fake/register.go index 405334899d..482cd3ed6c 100644 --- a/pkg/client/gateway/clientset/versioned/fake/register.go +++ b/pkg/client/gateway/clientset/versioned/fake/register.go @@ -23,15 +23,14 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" serializer "k8s.io/apimachinery/pkg/runtime/serializer" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" ) var scheme = runtime.NewScheme() var codecs = serializer.NewCodecFactory(scheme) var parameterCodec = runtime.NewParameterCodec(scheme) - -func init() { - v1.AddToGroupVersion(scheme, schema.GroupVersion{Version: "v1"}) - AddToScheme(scheme) +var localSchemeBuilder = runtime.SchemeBuilder{ + argoprojv1alpha1.AddToScheme, } // AddToScheme adds all types of this clientset into the given scheme. This allows composition @@ -44,10 +43,13 @@ func init() { // ) // // kclientset, _ := kubernetes.NewForConfig(c) -// aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) +// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) // // After this, RawExtensions in Kubernetes types will serialize kube-aggregator types // correctly. -func AddToScheme(scheme *runtime.Scheme) { - argoprojv1alpha1.AddToScheme(scheme) +var AddToScheme = localSchemeBuilder.AddToScheme + +func init() { + v1.AddToGroupVersion(scheme, schema.GroupVersion{Version: "v1"}) + utilruntime.Must(AddToScheme(scheme)) } diff --git a/pkg/client/gateway/clientset/versioned/scheme/register.go b/pkg/client/gateway/clientset/versioned/scheme/register.go index e3afa773f0..c00d416561 100644 --- a/pkg/client/gateway/clientset/versioned/scheme/register.go +++ b/pkg/client/gateway/clientset/versioned/scheme/register.go @@ -23,15 +23,14 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" serializer "k8s.io/apimachinery/pkg/runtime/serializer" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" ) var Scheme = runtime.NewScheme() var Codecs = serializer.NewCodecFactory(Scheme) var ParameterCodec = runtime.NewParameterCodec(Scheme) - -func init() { - v1.AddToGroupVersion(Scheme, schema.GroupVersion{Version: "v1"}) - AddToScheme(Scheme) +var localSchemeBuilder = runtime.SchemeBuilder{ + argoprojv1alpha1.AddToScheme, } // AddToScheme adds all types of this clientset into the given scheme. This allows composition @@ -44,10 +43,13 @@ func init() { // ) // // kclientset, _ := kubernetes.NewForConfig(c) -// aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) +// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) // // After this, RawExtensions in Kubernetes types will serialize kube-aggregator types // correctly. -func AddToScheme(scheme *runtime.Scheme) { - argoprojv1alpha1.AddToScheme(scheme) +var AddToScheme = localSchemeBuilder.AddToScheme + +func init() { + v1.AddToGroupVersion(Scheme, schema.GroupVersion{Version: "v1"}) + utilruntime.Must(AddToScheme(Scheme)) } diff --git a/pkg/client/gateway/clientset/versioned/typed/gateway/v1alpha1/fake/fake_gateway.go b/pkg/client/gateway/clientset/versioned/typed/gateway/v1alpha1/fake/fake_gateway.go index c76bfc734e..581ec0f080 100644 --- a/pkg/client/gateway/clientset/versioned/typed/gateway/v1alpha1/fake/fake_gateway.go +++ b/pkg/client/gateway/clientset/versioned/typed/gateway/v1alpha1/fake/fake_gateway.go @@ -61,7 +61,7 @@ func (c *FakeGateways) List(opts v1.ListOptions) (result *v1alpha1.GatewayList, if label == nil { label = labels.Everything() } - list := &v1alpha1.GatewayList{} + list := &v1alpha1.GatewayList{ListMeta: obj.(*v1alpha1.GatewayList).ListMeta} for _, item := range obj.(*v1alpha1.GatewayList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/pkg/client/gateway/informers/externalversions/factory.go b/pkg/client/gateway/informers/externalversions/factory.go index 1c223cc533..b1ab6e593a 100644 --- a/pkg/client/gateway/informers/externalversions/factory.go +++ b/pkg/client/gateway/informers/externalversions/factory.go @@ -31,12 +31,16 @@ import ( cache "k8s.io/client-go/tools/cache" ) +// SharedInformerOption defines the functional option type for SharedInformerFactory. +type SharedInformerOption func(*sharedInformerFactory) *sharedInformerFactory + type sharedInformerFactory struct { client versioned.Interface namespace string tweakListOptions internalinterfaces.TweakListOptionsFunc lock sync.Mutex defaultResync time.Duration + customResync map[reflect.Type]time.Duration informers map[reflect.Type]cache.SharedIndexInformer // startedInformers is used for tracking which informers have been started. @@ -44,23 +48,62 @@ type sharedInformerFactory struct { startedInformers map[reflect.Type]bool } -// NewSharedInformerFactory constructs a new instance of sharedInformerFactory +// WithCustomResyncConfig sets a custom resync period for the specified informer types. +func WithCustomResyncConfig(resyncConfig map[v1.Object]time.Duration) SharedInformerOption { + return func(factory *sharedInformerFactory) *sharedInformerFactory { + for k, v := range resyncConfig { + factory.customResync[reflect.TypeOf(k)] = v + } + return factory + } +} + +// WithTweakListOptions sets a custom filter on all listers of the configured SharedInformerFactory. +func WithTweakListOptions(tweakListOptions internalinterfaces.TweakListOptionsFunc) SharedInformerOption { + return func(factory *sharedInformerFactory) *sharedInformerFactory { + factory.tweakListOptions = tweakListOptions + return factory + } +} + +// WithNamespace limits the SharedInformerFactory to the specified namespace. +func WithNamespace(namespace string) SharedInformerOption { + return func(factory *sharedInformerFactory) *sharedInformerFactory { + factory.namespace = namespace + return factory + } +} + +// NewSharedInformerFactory constructs a new instance of sharedInformerFactory for all namespaces. func NewSharedInformerFactory(client versioned.Interface, defaultResync time.Duration) SharedInformerFactory { - return NewFilteredSharedInformerFactory(client, defaultResync, v1.NamespaceAll, nil) + return NewSharedInformerFactoryWithOptions(client, defaultResync) } // NewFilteredSharedInformerFactory constructs a new instance of sharedInformerFactory. // Listers obtained via this SharedInformerFactory will be subject to the same filters // as specified here. +// Deprecated: Please use NewSharedInformerFactoryWithOptions instead func NewFilteredSharedInformerFactory(client versioned.Interface, defaultResync time.Duration, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) SharedInformerFactory { - return &sharedInformerFactory{ + return NewSharedInformerFactoryWithOptions(client, defaultResync, WithNamespace(namespace), WithTweakListOptions(tweakListOptions)) +} + +// NewSharedInformerFactoryWithOptions constructs a new instance of a SharedInformerFactory with additional options. +func NewSharedInformerFactoryWithOptions(client versioned.Interface, defaultResync time.Duration, options ...SharedInformerOption) SharedInformerFactory { + factory := &sharedInformerFactory{ client: client, - namespace: namespace, - tweakListOptions: tweakListOptions, + namespace: v1.NamespaceAll, defaultResync: defaultResync, informers: make(map[reflect.Type]cache.SharedIndexInformer), startedInformers: make(map[reflect.Type]bool), + customResync: make(map[reflect.Type]time.Duration), + } + + // Apply all options + for _, opt := range options { + factory = opt(factory) } + + return factory } // Start initializes all requested informers. @@ -109,7 +152,13 @@ func (f *sharedInformerFactory) InformerFor(obj runtime.Object, newFunc internal if exists { return informer } - informer = newFunc(f.client, f.defaultResync) + + resyncPeriod, exists := f.customResync[informerType] + if !exists { + resyncPeriod = f.defaultResync + } + + informer = newFunc(f.client, resyncPeriod) f.informers[informerType] = informer return informer diff --git a/pkg/client/sensor/clientset/versioned/clientset.go b/pkg/client/sensor/clientset/versioned/clientset.go index 83cac1c877..512c483aaf 100644 --- a/pkg/client/sensor/clientset/versioned/clientset.go +++ b/pkg/client/sensor/clientset/versioned/clientset.go @@ -19,7 +19,6 @@ package versioned import ( argoprojv1alpha1 "github.com/argoproj/argo-events/pkg/client/sensor/clientset/versioned/typed/sensor/v1alpha1" - glog "github.com/golang/glog" discovery "k8s.io/client-go/discovery" rest "k8s.io/client-go/rest" flowcontrol "k8s.io/client-go/util/flowcontrol" @@ -73,7 +72,6 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { cs.DiscoveryClient, err = discovery.NewDiscoveryClientForConfig(&configShallowCopy) if err != nil { - glog.Errorf("failed to create the DiscoveryClient: %v", err) return nil, err } return &cs, nil diff --git a/pkg/client/sensor/clientset/versioned/fake/clientset_generated.go b/pkg/client/sensor/clientset/versioned/fake/clientset_generated.go index 9e0622bbd5..9f9a6df395 100644 --- a/pkg/client/sensor/clientset/versioned/fake/clientset_generated.go +++ b/pkg/client/sensor/clientset/versioned/fake/clientset_generated.go @@ -40,9 +40,10 @@ func NewSimpleClientset(objects ...runtime.Object) *Clientset { } } - fakePtr := testing.Fake{} - fakePtr.AddReactor("*", "*", testing.ObjectReaction(o)) - fakePtr.AddWatchReactor("*", func(action testing.Action) (handled bool, ret watch.Interface, err error) { + cs := &Clientset{} + cs.discovery = &fakediscovery.FakeDiscovery{Fake: &cs.Fake} + cs.AddReactor("*", "*", testing.ObjectReaction(o)) + cs.AddWatchReactor("*", func(action testing.Action) (handled bool, ret watch.Interface, err error) { gvr := action.GetResource() ns := action.GetNamespace() watch, err := o.Watch(gvr, ns) @@ -52,7 +53,7 @@ func NewSimpleClientset(objects ...runtime.Object) *Clientset { return true, watch, nil }) - return &Clientset{fakePtr, &fakediscovery.FakeDiscovery{Fake: &fakePtr}} + return cs } // Clientset implements clientset.Interface. Meant to be embedded into a diff --git a/pkg/client/sensor/clientset/versioned/fake/register.go b/pkg/client/sensor/clientset/versioned/fake/register.go index 07fdd02873..57e50f01da 100644 --- a/pkg/client/sensor/clientset/versioned/fake/register.go +++ b/pkg/client/sensor/clientset/versioned/fake/register.go @@ -23,15 +23,14 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" serializer "k8s.io/apimachinery/pkg/runtime/serializer" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" ) var scheme = runtime.NewScheme() var codecs = serializer.NewCodecFactory(scheme) var parameterCodec = runtime.NewParameterCodec(scheme) - -func init() { - v1.AddToGroupVersion(scheme, schema.GroupVersion{Version: "v1"}) - AddToScheme(scheme) +var localSchemeBuilder = runtime.SchemeBuilder{ + argoprojv1alpha1.AddToScheme, } // AddToScheme adds all types of this clientset into the given scheme. This allows composition @@ -44,10 +43,13 @@ func init() { // ) // // kclientset, _ := kubernetes.NewForConfig(c) -// aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) +// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) // // After this, RawExtensions in Kubernetes types will serialize kube-aggregator types // correctly. -func AddToScheme(scheme *runtime.Scheme) { - argoprojv1alpha1.AddToScheme(scheme) +var AddToScheme = localSchemeBuilder.AddToScheme + +func init() { + v1.AddToGroupVersion(scheme, schema.GroupVersion{Version: "v1"}) + utilruntime.Must(AddToScheme(scheme)) } diff --git a/pkg/client/sensor/clientset/versioned/scheme/register.go b/pkg/client/sensor/clientset/versioned/scheme/register.go index 295906a212..f73b48c8c0 100644 --- a/pkg/client/sensor/clientset/versioned/scheme/register.go +++ b/pkg/client/sensor/clientset/versioned/scheme/register.go @@ -23,15 +23,14 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" serializer "k8s.io/apimachinery/pkg/runtime/serializer" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" ) var Scheme = runtime.NewScheme() var Codecs = serializer.NewCodecFactory(Scheme) var ParameterCodec = runtime.NewParameterCodec(Scheme) - -func init() { - v1.AddToGroupVersion(Scheme, schema.GroupVersion{Version: "v1"}) - AddToScheme(Scheme) +var localSchemeBuilder = runtime.SchemeBuilder{ + argoprojv1alpha1.AddToScheme, } // AddToScheme adds all types of this clientset into the given scheme. This allows composition @@ -44,10 +43,13 @@ func init() { // ) // // kclientset, _ := kubernetes.NewForConfig(c) -// aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) +// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) // // After this, RawExtensions in Kubernetes types will serialize kube-aggregator types // correctly. -func AddToScheme(scheme *runtime.Scheme) { - argoprojv1alpha1.AddToScheme(scheme) +var AddToScheme = localSchemeBuilder.AddToScheme + +func init() { + v1.AddToGroupVersion(Scheme, schema.GroupVersion{Version: "v1"}) + utilruntime.Must(AddToScheme(Scheme)) } diff --git a/pkg/client/sensor/clientset/versioned/typed/sensor/v1alpha1/fake/fake_sensor.go b/pkg/client/sensor/clientset/versioned/typed/sensor/v1alpha1/fake/fake_sensor.go index f8529c3649..6838f87597 100644 --- a/pkg/client/sensor/clientset/versioned/typed/sensor/v1alpha1/fake/fake_sensor.go +++ b/pkg/client/sensor/clientset/versioned/typed/sensor/v1alpha1/fake/fake_sensor.go @@ -61,7 +61,7 @@ func (c *FakeSensors) List(opts v1.ListOptions) (result *v1alpha1.SensorList, er if label == nil { label = labels.Everything() } - list := &v1alpha1.SensorList{} + list := &v1alpha1.SensorList{ListMeta: obj.(*v1alpha1.SensorList).ListMeta} for _, item := range obj.(*v1alpha1.SensorList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/pkg/client/sensor/informers/externalversions/factory.go b/pkg/client/sensor/informers/externalversions/factory.go index 229d8f3b86..32c44340f6 100644 --- a/pkg/client/sensor/informers/externalversions/factory.go +++ b/pkg/client/sensor/informers/externalversions/factory.go @@ -31,12 +31,16 @@ import ( cache "k8s.io/client-go/tools/cache" ) +// SharedInformerOption defines the functional option type for SharedInformerFactory. +type SharedInformerOption func(*sharedInformerFactory) *sharedInformerFactory + type sharedInformerFactory struct { client versioned.Interface namespace string tweakListOptions internalinterfaces.TweakListOptionsFunc lock sync.Mutex defaultResync time.Duration + customResync map[reflect.Type]time.Duration informers map[reflect.Type]cache.SharedIndexInformer // startedInformers is used for tracking which informers have been started. @@ -44,23 +48,62 @@ type sharedInformerFactory struct { startedInformers map[reflect.Type]bool } -// NewSharedInformerFactory constructs a new instance of sharedInformerFactory +// WithCustomResyncConfig sets a custom resync period for the specified informer types. +func WithCustomResyncConfig(resyncConfig map[v1.Object]time.Duration) SharedInformerOption { + return func(factory *sharedInformerFactory) *sharedInformerFactory { + for k, v := range resyncConfig { + factory.customResync[reflect.TypeOf(k)] = v + } + return factory + } +} + +// WithTweakListOptions sets a custom filter on all listers of the configured SharedInformerFactory. +func WithTweakListOptions(tweakListOptions internalinterfaces.TweakListOptionsFunc) SharedInformerOption { + return func(factory *sharedInformerFactory) *sharedInformerFactory { + factory.tweakListOptions = tweakListOptions + return factory + } +} + +// WithNamespace limits the SharedInformerFactory to the specified namespace. +func WithNamespace(namespace string) SharedInformerOption { + return func(factory *sharedInformerFactory) *sharedInformerFactory { + factory.namespace = namespace + return factory + } +} + +// NewSharedInformerFactory constructs a new instance of sharedInformerFactory for all namespaces. func NewSharedInformerFactory(client versioned.Interface, defaultResync time.Duration) SharedInformerFactory { - return NewFilteredSharedInformerFactory(client, defaultResync, v1.NamespaceAll, nil) + return NewSharedInformerFactoryWithOptions(client, defaultResync) } // NewFilteredSharedInformerFactory constructs a new instance of sharedInformerFactory. // Listers obtained via this SharedInformerFactory will be subject to the same filters // as specified here. +// Deprecated: Please use NewSharedInformerFactoryWithOptions instead func NewFilteredSharedInformerFactory(client versioned.Interface, defaultResync time.Duration, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) SharedInformerFactory { - return &sharedInformerFactory{ + return NewSharedInformerFactoryWithOptions(client, defaultResync, WithNamespace(namespace), WithTweakListOptions(tweakListOptions)) +} + +// NewSharedInformerFactoryWithOptions constructs a new instance of a SharedInformerFactory with additional options. +func NewSharedInformerFactoryWithOptions(client versioned.Interface, defaultResync time.Duration, options ...SharedInformerOption) SharedInformerFactory { + factory := &sharedInformerFactory{ client: client, - namespace: namespace, - tweakListOptions: tweakListOptions, + namespace: v1.NamespaceAll, defaultResync: defaultResync, informers: make(map[reflect.Type]cache.SharedIndexInformer), startedInformers: make(map[reflect.Type]bool), + customResync: make(map[reflect.Type]time.Duration), + } + + // Apply all options + for _, opt := range options { + factory = opt(factory) } + + return factory } // Start initializes all requested informers. @@ -109,7 +152,13 @@ func (f *sharedInformerFactory) InformerFor(obj runtime.Object, newFunc internal if exists { return informer } - informer = newFunc(f.client, f.defaultResync) + + resyncPeriod, exists := f.customResync[informerType] + if !exists { + resyncPeriod = f.defaultResync + } + + informer = newFunc(f.client, resyncPeriod) f.informers[informerType] = informer return informer diff --git a/sensors/config.go b/sensors/config.go index 11eff55c97..3499d695e4 100644 --- a/sensors/config.go +++ b/sensors/config.go @@ -1,12 +1,14 @@ package sensors import ( + "github.com/nats-io/go-nats" "net/http" "github.com/argoproj/argo-events/common" "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" ss_v1alpha1 "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" clientset "github.com/argoproj/argo-events/pkg/client/sensor/clientset/versioned" + snats "github.com/nats-io/go-nats-streaming" "github.com/rs/zerolog" "k8s.io/client-go/discovery" "k8s.io/client-go/dynamic" @@ -35,6 +37,15 @@ type sensorExecutionCtx struct { controllerInstanceID string // updated indicates update to sensor resource updated bool + // nconn is the nats connection + nconn natsconn +} + +type natsconn struct { + // standard connection + standard *nats.Conn + // streaming connection + stream snats.Conn } // updateNotification is servers as a notification message that can be used to update event dependency's state or the sensor resource diff --git a/sensors/event-handler.go b/sensors/event-handler.go index 718051de63..42d96c638d 100644 --- a/sensors/event-handler.go +++ b/sensors/event-handler.go @@ -20,12 +20,11 @@ import ( "context" "encoding/json" "fmt" - "github.com/argoproj/argo-events/pkg/apis/sensor" - "io/ioutil" "net/http" "github.com/argoproj/argo-events/common" sn "github.com/argoproj/argo-events/controllers/sensor" + "github.com/argoproj/argo-events/pkg/apis/sensor" "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" ss_v1alpha1 "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" ) @@ -109,8 +108,6 @@ func (sec *sensorExecutionCtx) processUpdateNotification(ew *updateNotification) // change node state to error sn.MarkNodePhase(sec.sensor, ew.event.Context.Source.Host, v1alpha1.NodeTypeEventDependency, v1alpha1.NodePhaseError, nil, &sec.log, fmt.Sprintf("failed to apply filter. err: %v", err)) - - common.SendErrorResponse(ew.writer) return } @@ -120,13 +117,9 @@ func (sec *sensorExecutionCtx) processUpdateNotification(ew *updateNotification) // change node state to error sn.MarkNodePhase(sec.sensor, ew.event.Context.Source.Host, v1alpha1.NodeTypeEventDependency, v1alpha1.NodePhaseError, nil, &sec.log, "event did not pass filters") - - common.SendErrorResponse(ew.writer) return } - // send success response back to gateway as it is a valid notification - common.SendSuccessResponse(ew.writer) sn.MarkNodePhase(sec.sensor, ew.event.Context.Source.Host, v1alpha1.NodeTypeEventDependency, v1alpha1.NodePhaseComplete, ew.event, &sec.log, "event is received") // check if all event dependencies are complete and kick-off triggers @@ -135,25 +128,30 @@ func (sec *sensorExecutionCtx) processUpdateNotification(ew *updateNotification) case v1alpha1.ResourceUpdateNotification: sec.log.Info().Msg("sensor resource update") // update sensor resource - if !EqualEventDependencies(sec.sensor.Spec.EventDependencies, ew.sensor.Spec.EventDependencies) || !EqualTriggers(sec.sensor.Spec.Triggers, ew.sensor.Spec.Triggers) { - sec.sensor = ew.sensor - - // initialize new event dependencies - for _, ed := range sec.sensor.Spec.EventDependencies { - if node := sn.GetNodeByName(sec.sensor, ed.Name); node == nil { - sn.InitializeNode(sec.sensor, ed.Name, v1alpha1.NodeTypeEventDependency, &sec.log) - sn.MarkNodePhase(sec.sensor, ed.Name, v1alpha1.NodeTypeEventDependency, v1alpha1.NodePhaseActive, nil, &sec.log, "event dependency is active") - } + sec.sensor = ew.sensor + + hasDependenciesUpdated := false + + // initialize new event dependencies + for _, ed := range sec.sensor.Spec.Dependencies { + if node := sn.GetNodeByName(sec.sensor, ed.Name); node == nil { + sn.InitializeNode(sec.sensor, ed.Name, v1alpha1.NodeTypeEventDependency, &sec.log) + sn.MarkNodePhase(sec.sensor, ed.Name, v1alpha1.NodeTypeEventDependency, v1alpha1.NodePhaseActive, nil, &sec.log, "event dependency is active") } + } - // initialize new triggers - for _, t := range sec.sensor.Spec.Triggers { - if node := sn.GetNodeByName(sec.sensor, t.Name); node == nil { - sn.InitializeNode(sec.sensor, t.Name, v1alpha1.NodeTypeTrigger, &sec.log) - } + // initialize new triggers + for _, t := range sec.sensor.Spec.Triggers { + if node := sn.GetNodeByName(sec.sensor, t.Name); node == nil { + hasDependenciesUpdated = true + sn.InitializeNode(sec.sensor, t.Name, v1alpha1.NodeTypeTrigger, &sec.log) } } + if hasDependenciesUpdated { + sec.NatsEventProtocol() + } + default: sec.log.Error().Str("notification-type", string(ew.notificationType)).Msg("unknown notification type") } @@ -168,70 +166,55 @@ func (sec *sensorExecutionCtx) WatchEventsFromGateways() { } }() - // if a sensor resource is updated, syncSensor will take care of updating current sensor context - // note: updating sensor resource will result in loss of all existing events stored in nodes. - // Once the NATS streaming support is added, user can replay the events. go func() { if _, err := sec.syncSensor(context.Background()); err != nil { sec.log.Error().Err(err).Msg("failed to sync sensor resource") } }() - // create a http server. this server listens for events from gateway. - sec.server = &http.Server{Addr: fmt.Sprintf(":%s", common.SensorServicePort)} - - // add a handler to handle incoming events - http.HandleFunc("/", sec.eventHandler) - - sec.log.Info().Str("port", string(common.SensorServicePort)).Msg("sensor started listening") - if err := sec.server.ListenAndServe(); err != nil { - sec.log.Error().Err(err).Msg("sensor server stopped") - // escalate error - labels := map[string]string{ - common.LabelEventType: string(common.EscalationEventType), - common.LabelSensorName: sec.sensor.Name, - common.LabelOperation: "server_shutdown", + switch sec.sensor.Spec.EventProtocol.Type { + case v1alpha1.HTTP: + sec.HttpEventProtocol() + case v1alpha1.NATS: + sec.NatsEventProtocol() + var err error + if sec.sensor, err = sn.PersistUpdates(sec.sensorClient, sec.sensor, sec.controllerInstanceID, &sec.log); err != nil { + sec.log.Error().Err(err).Msg("failed to persist sensor update") } - if err := common.GenerateK8sEvent(sec.kubeClient, fmt.Sprintf("sensor server stopped"), common.EscalationEventType, - "server shutdown", sec.sensor.Name, sec.sensor.Namespace, sec.controllerInstanceID, sensor.Kind, labels); err != nil { - sec.log.Error().Err(err).Msg("failed to create K8s event to log server shutdown error") + } +} + +// validateEvent validates whether the event is indeed from gateway that this sensor is watching +func (sec *sensorExecutionCtx) validateEvent(events *ss_v1alpha1.Event) (*ss_v1alpha1.EventDependency, bool) { + for _, event := range sec.sensor.Spec.Dependencies { + if event.Name == events.Context.Source.Host { + return &event, true } } + return nil, false } -// Handles events received from gateways -func (sec *sensorExecutionCtx) eventHandler(w http.ResponseWriter, r *http.Request) { - sec.log.Info().Msg("received an event from gateway") - body, err := ioutil.ReadAll(r.Body) +func (sec *sensorExecutionCtx) parseEvent(payload []byte) (*v1alpha1.Event, error) { var event *ss_v1alpha1.Event - if err = json.Unmarshal(body, &event); err != nil { - sec.log.Error().Err(err).Msg("failed to parse event received from gateway") - common.SendErrorResponse(w) - return + if err := json.Unmarshal(payload, &event); err != nil { + response := "failed to parse event received from gateway" + sec.log.Error().Err(err).Msg(response) + return nil, err } + return event, nil +} +func (sec *sensorExecutionCtx) sendEventToInternalQueue(event *v1alpha1.Event, writer http.ResponseWriter) bool { // validate whether the event is from gateway that this sensor is watching if eventDependency, isValidEvent := sec.validateEvent(event); isValidEvent { // process the event sec.queue <- &updateNotification{ event: event, - writer: w, + writer: writer, eventDependency: eventDependency, notificationType: v1alpha1.EventNotification, } - return + return true } - - sec.log.Warn().Str("event-source-name", event.Context.Source.Host).Msg("event is from unknown source") - common.SendErrorResponse(w) -} - -// validateEvent validates whether the event is indeed from gateway that this sensor is watching -func (sec *sensorExecutionCtx) validateEvent(events *ss_v1alpha1.Event) (*ss_v1alpha1.EventDependency, bool) { - for _, event := range sec.sensor.Spec.EventDependencies { - if event.Name == events.Context.Source.Host { - return &event, true - } - } - return nil, false + return false } diff --git a/sensors/event-handler_test.go b/sensors/event-handler_test.go index 297e9f4caf..f6c8e8f1dc 100644 --- a/sensors/event-handler_test.go +++ b/sensors/event-handler_test.go @@ -154,7 +154,7 @@ func TestEventHandler(t *testing.T) { convey.Convey("Update sensor event dependencies", func() { sensor = sec.sensor.DeepCopy() - sensor.Spec.EventDependencies = append(sensor.Spec.EventDependencies, v1alpha1.EventDependency{ + sensor.Spec.Dependencies = append(sensor.Spec.Dependencies, v1alpha1.EventDependency{ Name: "test-gateway/test2", }) sec.processUpdateNotification(&updateNotification{ diff --git a/sensors/http-events-handler.go b/sensors/http-events-handler.go new file mode 100644 index 0000000000..c6bc60ce61 --- /dev/null +++ b/sensors/http-events-handler.go @@ -0,0 +1,82 @@ +/* +Copyright 2018 BlackRock, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package sensors + +import ( + "fmt" + "io/ioutil" + "net/http" + + "github.com/argoproj/argo-events/common" + "github.com/argoproj/argo-events/pkg/apis/sensor" +) + +// HttpEventProtocol handles events sent over HTTP +func (sec *sensorExecutionCtx) HttpEventProtocol() { + // create a http server. this server listens for events from gateway. + sec.server = &http.Server{Addr: fmt.Sprintf(":%s", common.SensorServicePort)} + + // add a handler to handle incoming events + http.HandleFunc("/", sec.httpEventHandler) + + sec.log.Info().Str("port", string(common.SensorServicePort)).Msg("sensor started listening") + if err := sec.server.ListenAndServe(); err != nil { + sec.log.Error().Err(err).Msg("sensor server stopped") + // escalate error + labels := map[string]string{ + common.LabelEventType: string(common.EscalationEventType), + common.LabelSensorName: sec.sensor.Name, + common.LabelOperation: "server_shutdown", + } + if err := common.GenerateK8sEvent(sec.kubeClient, fmt.Sprintf("sensor server stopped"), common.EscalationEventType, + "server shutdown", sec.sensor.Name, sec.sensor.Namespace, sec.controllerInstanceID, sensor.Kind, labels); err != nil { + sec.log.Error().Err(err).Msg("failed to create K8s event to log server shutdown error") + } + } +} + +// Handles events received from gateways sent over http +func (sec *sensorExecutionCtx) httpEventHandler(w http.ResponseWriter, r *http.Request) { + var response string + + sec.log.Info().Msg("received an event from gateway") + body, err := ioutil.ReadAll(r.Body) + if err != nil { + response = "failed to read request body" + sec.log.Error().Err(err).Msg(response) + common.SendErrorResponse(w, response) + } + + event, err := sec.parseEvent(body) + if err != nil { + response = "failed to parse request into event" + sec.log.Error().Err(err).Msg(response) + common.SendErrorResponse(w, response) + } + + // validate whether the event is from gateway that this sensor is watching and send event over internal queue if valid + if sec.sendEventToInternalQueue(event, w) { + response = "message successfully sent over internal queue" + sec.log.Info().Str("event-source-name", event.Context.Source.Host).Msg(response) + common.SendSuccessResponse(w, response) + return + } + + response = "event is from unknown source" + sec.log.Warn().Str("event-source-name", event.Context.Source.Host).Msg(response) + common.SendErrorResponse(w, response) +} diff --git a/sensors/nats-events-handler.go b/sensors/nats-events-handler.go new file mode 100644 index 0000000000..04b667a3a6 --- /dev/null +++ b/sensors/nats-events-handler.go @@ -0,0 +1,129 @@ +package sensors + +import ( + "strconv" + "time" + + "github.com/argoproj/argo-events/common" + "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" + "github.com/nats-io/go-nats" + snats "github.com/nats-io/go-nats-streaming" +) + +// NatsEventProtocol handles events sent over NATS +func (sec *sensorExecutionCtx) NatsEventProtocol() { + var err error + + switch sec.sensor.Spec.EventProtocol.Nats.Type { + case v1alpha1.Standard: + if sec.nconn.standard == nil { + sec.nconn.standard, err = nats.Connect(sec.sensor.Spec.EventProtocol.Nats.URL) + if err != nil { + sec.log.Panic().Err(err).Msg("failed to connect to nats server") + } + } + for _, dependency := range sec.sensor.Spec.Dependencies { + if dependency.Connected { + continue + } + if _, err := sec.getNatsStandardSubscription(dependency.Name); err != nil { + sec.log.Panic().Err(err).Str("event-source-name", dependency.Name).Msg("failed to get the nats subscription") + } + dependency.Connected = true + } + + case v1alpha1.Streaming: + if sec.nconn.stream == nil { + sec.nconn.stream, err = snats.Connect(sec.sensor.Spec.EventProtocol.Nats.ClusterId, sec.sensor.Spec.EventProtocol.Nats.ClientId, snats.NatsURL(sec.sensor.Spec.EventProtocol.Nats.URL)) + if err != nil { + sec.log.Panic().Err(err).Msg("failed to connect to nats streaming server") + } + } + for _, dependency := range sec.sensor.Spec.Dependencies { + if dependency.Connected { + continue + } + if _, err := sec.getNatsStreamingSubscription(dependency.Name); err != nil { + sec.log.Panic().Err(err).Str("event-source-name", dependency.Name).Msg("failed to get the nats subscription") + } + dependency.Connected = true + } + } +} + +// getNatsStandardSubscription returns a standard nats subscription +func (sec *sensorExecutionCtx) getNatsStandardSubscription(eventSource string) (*nats.Subscription, error) { + return sec.nconn.standard.QueueSubscribe(eventSource, eventSource, func(msg *nats.Msg) { + sec.processNatsMessage(msg.Data, eventSource) + }) +} + +// getNatsStreamingSubscription returns a streaming nats subscription +func (sec *sensorExecutionCtx) getNatsStreamingSubscription(eventSource string) (snats.Subscription, error) { + if sec.sensor.Spec.EventProtocol.Nats.StartWithLastReceived { + return sec.nconn.stream.Subscribe(eventSource, func(msg *snats.Msg) { + sec.processNatsMessage(msg.Data, eventSource) + }, snats.StartWithLastReceived()) + } + + if sec.sensor.Spec.EventProtocol.Nats.DeliverAllAvailable { + return sec.nconn.stream.Subscribe(eventSource, func(msg *snats.Msg) { + sec.processNatsMessage(msg.Data, eventSource) + }, snats.DeliverAllAvailable()) + } + + if sec.sensor.Spec.EventProtocol.Nats.Durable { + return sec.nconn.stream.Subscribe(eventSource, func(msg *snats.Msg) { + sec.processNatsMessage(msg.Data, eventSource) + }, snats.DurableName(eventSource)) + } + + if sec.sensor.Spec.EventProtocol.Nats.StartAtSequence != "" { + sequence, err := strconv.Atoi(sec.sensor.Spec.EventProtocol.Nats.StartAtSequence) + if err != nil { + return nil, err + } + return sec.nconn.stream.Subscribe(eventSource, func(msg *snats.Msg) { + sec.processNatsMessage(msg.Data, eventSource) + }, snats.StartAtSequence(uint64(sequence))) + } + + if sec.sensor.Spec.EventProtocol.Nats.StartAtTime != "" { + startTime, err := time.Parse(common.StandardTimeFormat, sec.sensor.Spec.EventProtocol.Nats.StartAtTime) + if err != nil { + return nil, err + } + return sec.nconn.stream.Subscribe(eventSource, func(msg *snats.Msg) { + sec.processNatsMessage(msg.Data, eventSource) + }, snats.StartAtTime(startTime)) + } + + if sec.sensor.Spec.EventProtocol.Nats.StartAtTimeDelta != "" { + duration, err := time.ParseDuration(sec.sensor.Spec.EventProtocol.Nats.StartAtTimeDelta) + if err != nil { + return nil, err + } + return sec.nconn.stream.Subscribe(eventSource, func(msg *snats.Msg) { + sec.processNatsMessage(msg.Data, eventSource) + }, snats.StartAtTimeDelta(duration)) + } + + return sec.nconn.stream.Subscribe(eventSource, func(msg *snats.Msg) { + sec.processNatsMessage(msg.Data, eventSource) + }) +} + +// processNatsMessage handles a nats message payload +func (sec *sensorExecutionCtx) processNatsMessage(msg []byte, eventSource string) { + event, err := sec.parseEvent(msg) + if err != nil { + sec.log.Error().Err(err).Str("event-source-name", eventSource).Msg("failed to parse message into event") + return + } + // validate whether the event is from gateway that this sensor is watching and send event over internal queue if valid + if sec.sendEventToInternalQueue(event, nil) { + sec.log.Info().Str("event-source-name", eventSource).Msg("event successfully sent over internal queue") + return + } + sec.log.Warn().Str("event-source-name", eventSource).Msg("event is from unknown source") +} diff --git a/sensors/trigger.go b/sensors/trigger.go index 78af212101..652277e9ab 100644 --- a/sensors/trigger.go +++ b/sensors/trigger.go @@ -77,7 +77,7 @@ func (sec *sensorExecutionCtx) processTriggers() { } // Mark all signal nodes as active - for _, dep := range sec.sensor.Spec.EventDependencies { + for _, dep := range sec.sensor.Spec.Dependencies { sn.MarkNodePhase(sec.sensor, dep.Name, v1alpha1.NodeTypeEventDependency, v1alpha1.NodePhaseActive, nil, &sec.log, "node is re-initialized") } return From ec56ca80b043474faca6de500d3b0c64723bb87f Mon Sep 17 00:00:00 2001 From: vpage Date: Sat, 19 Jan 2019 09:21:27 -0500 Subject: [PATCH 06/22] Changing nats subscription to queue subscription --- common/util.go | 5 +++++ pkg/apis/sensor/v1alpha1/types.go | 20 ++++++-------------- sensors/nats-events-handler.go | 24 ++++++++++++++---------- 3 files changed, 25 insertions(+), 24 deletions(-) diff --git a/common/util.go b/common/util.go index 94e5a9a227..4d9aba4140 100644 --- a/common/util.go +++ b/common/util.go @@ -47,6 +47,11 @@ func DefaultGatewayConfigurationName(gatewayName string, configurationName strin return fmt.Sprintf("%s/%s", gatewayName, configurationName) } +// DefaultNatsQueueName returns a queue name for nats subject +func DefaultNatsQueueName(subject string) string { + return fmt.Sprintf("%s-%s", subject, "queue") +} + // GetClientConfig return rest config, if path not specified, assume in cluster config func GetClientConfig(kubeconfig string) (*rest.Config, error) { if kubeconfig != "" { diff --git a/pkg/apis/sensor/v1alpha1/types.go b/pkg/apis/sensor/v1alpha1/types.go index fda6ac112a..5b237fd891 100644 --- a/pkg/apis/sensor/v1alpha1/types.go +++ b/pkg/apis/sensor/v1alpha1/types.go @@ -76,9 +76,8 @@ const ( // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // +k8s:openapi-gen=true type Sensor struct { - // +k8s:openapi-gen=false v1.TypeMeta `json:",inline"` - // +k8s:openapi-gen=false + v1.ObjectMeta `json:"metadata" protobuf:"bytes,1,opt,name=metadata"` Spec SensorSpec `json:"spec" protobuf:"bytes,2,opt,name=spec"` Status SensorStatus `json:"status" protobuf:"bytes,3,opt,name=status"` @@ -87,9 +86,7 @@ type Sensor struct { // SensorList is the list of Sensor resources // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object type SensorList struct { - // +k8s:openapi-gen=false v1.TypeMeta `json:",inline"` - // +k8s:openapi-gen=false v1.ListMeta `json:"metadata" protobuf:"bytes,1,opt,name=metadata"` Items []Sensor `json:"items" protobuf:"bytes,2,rep,name=items"` } @@ -313,7 +310,6 @@ type ResourceObject struct { GroupVersionKind `json:",inline" protobuf:"bytes,5,opt,name=groupVersionKind"` // Namespace in which to create this object - // optional // defaults to the service account namespace Namespace string `json:"namespace" protobuf:"bytes,1,opt,name=namespace"` @@ -403,11 +399,9 @@ type NodeStatus struct { Phase NodePhase `json:"phase" protobuf:"bytes,5,opt,name=phase"` // StartedAt is the time at which this node started - // +k8s:openapi-gen=false StartedAt v1.MicroTime `json:"startedAt,omitempty" protobuf:"bytes,6,opt,name=startedAt"` // CompletedAt is the time at which this node completed - // +k8s:openapi-gen=false CompletedAt v1.MicroTime `json:"completedAt,omitempty" protobuf:"bytes,7,opt,name=completedAt"` // store data or something to save for event notifications or trigger events @@ -448,7 +442,7 @@ type EventContext struct { EventID string `json:"eventID" protobuf:"bytes,5,opt,name=eventID"` // Timestamp of when the event happened. Must adhere to format specified in RFC 3339. - // +k8s:openapi-gen=false + EventTime v1.MicroTime `json:"eventTime" protobuf:"bytes,6,opt,name=eventTime"` // A link to the schema that the data attribute adheres to. @@ -501,13 +495,11 @@ type S3Artifact struct { // S3Bucket contains information for an S3 Bucket type S3Bucket struct { - Endpoint string `json:"endpoint,omitempty" protobuf:"bytes,1,opt,name=endpoint"` - Bucket string `json:"bucket,omitempty" protobuf:"bytes,2,opt,name=bucket"` - Region string `json:"region,omitempty" protobuf:"bytes,3,opt,name=region"` - Insecure bool `json:"insecure,omitempty" protobuf:"varint,4,opt,name=insecure"` - // +k8s:openapi-gen=false + Endpoint string `json:"endpoint,omitempty" protobuf:"bytes,1,opt,name=endpoint"` + Bucket string `json:"bucket,omitempty" protobuf:"bytes,2,opt,name=bucket"` + Region string `json:"region,omitempty" protobuf:"bytes,3,opt,name=region"` + Insecure bool `json:"insecure,omitempty" protobuf:"varint,4,opt,name=insecure"` AccessKey *corev1.SecretKeySelector `json:"accessKey,omitempty" protobuf:"bytes,5,opt,name=accessKey"` - // +k8s:openapi-gen=false SecretKey *corev1.SecretKeySelector `json:"secretKey,omitempty" protobuf:"bytes,6,opt,name=secretKey"` } diff --git a/sensors/nats-events-handler.go b/sensors/nats-events-handler.go index 04b667a3a6..db9e74b9c4 100644 --- a/sensors/nats-events-handler.go +++ b/sensors/nats-events-handler.go @@ -11,6 +11,10 @@ import ( ) // NatsEventProtocol handles events sent over NATS +// Queue subscription is used because lets say sensor is running with couple of dependencies and the subscription is +// established for them and then sensor resource failed to persist updates. So for the next sensor resource update, the dependency connected +// status will evaluate as false which will cause another subscription for that dependency. This will result in two subscriptions for the same dependency +// trying to put a message twice on internal queue. func (sec *sensorExecutionCtx) NatsEventProtocol() { var err error @@ -27,7 +31,7 @@ func (sec *sensorExecutionCtx) NatsEventProtocol() { continue } if _, err := sec.getNatsStandardSubscription(dependency.Name); err != nil { - sec.log.Panic().Err(err).Str("event-source-name", dependency.Name).Msg("failed to get the nats subscription") + sec.log.Error().Err(err).Str("event-source-name", dependency.Name).Msg("failed to get the nats subscription") } dependency.Connected = true } @@ -44,7 +48,7 @@ func (sec *sensorExecutionCtx) NatsEventProtocol() { continue } if _, err := sec.getNatsStreamingSubscription(dependency.Name); err != nil { - sec.log.Panic().Err(err).Str("event-source-name", dependency.Name).Msg("failed to get the nats subscription") + sec.log.Error().Err(err).Str("event-source-name", dependency.Name).Msg("failed to get the nats subscription") } dependency.Connected = true } @@ -53,7 +57,7 @@ func (sec *sensorExecutionCtx) NatsEventProtocol() { // getNatsStandardSubscription returns a standard nats subscription func (sec *sensorExecutionCtx) getNatsStandardSubscription(eventSource string) (*nats.Subscription, error) { - return sec.nconn.standard.QueueSubscribe(eventSource, eventSource, func(msg *nats.Msg) { + return sec.nconn.standard.QueueSubscribe(eventSource, common.DefaultNatsQueueName(eventSource), func(msg *nats.Msg) { sec.processNatsMessage(msg.Data, eventSource) }) } @@ -61,19 +65,19 @@ func (sec *sensorExecutionCtx) getNatsStandardSubscription(eventSource string) ( // getNatsStreamingSubscription returns a streaming nats subscription func (sec *sensorExecutionCtx) getNatsStreamingSubscription(eventSource string) (snats.Subscription, error) { if sec.sensor.Spec.EventProtocol.Nats.StartWithLastReceived { - return sec.nconn.stream.Subscribe(eventSource, func(msg *snats.Msg) { + return sec.nconn.stream.QueueSubscribe(eventSource, common.DefaultNatsQueueName(eventSource), func(msg *snats.Msg) { sec.processNatsMessage(msg.Data, eventSource) }, snats.StartWithLastReceived()) } if sec.sensor.Spec.EventProtocol.Nats.DeliverAllAvailable { - return sec.nconn.stream.Subscribe(eventSource, func(msg *snats.Msg) { + return sec.nconn.stream.QueueSubscribe(eventSource, common.DefaultNatsQueueName(eventSource), func(msg *snats.Msg) { sec.processNatsMessage(msg.Data, eventSource) }, snats.DeliverAllAvailable()) } if sec.sensor.Spec.EventProtocol.Nats.Durable { - return sec.nconn.stream.Subscribe(eventSource, func(msg *snats.Msg) { + return sec.nconn.stream.QueueSubscribe(eventSource, common.DefaultNatsQueueName(eventSource), func(msg *snats.Msg) { sec.processNatsMessage(msg.Data, eventSource) }, snats.DurableName(eventSource)) } @@ -83,7 +87,7 @@ func (sec *sensorExecutionCtx) getNatsStreamingSubscription(eventSource string) if err != nil { return nil, err } - return sec.nconn.stream.Subscribe(eventSource, func(msg *snats.Msg) { + return sec.nconn.stream.QueueSubscribe(eventSource, common.DefaultNatsQueueName(eventSource), func(msg *snats.Msg) { sec.processNatsMessage(msg.Data, eventSource) }, snats.StartAtSequence(uint64(sequence))) } @@ -93,7 +97,7 @@ func (sec *sensorExecutionCtx) getNatsStreamingSubscription(eventSource string) if err != nil { return nil, err } - return sec.nconn.stream.Subscribe(eventSource, func(msg *snats.Msg) { + return sec.nconn.stream.QueueSubscribe(eventSource, common.DefaultNatsQueueName(eventSource), func(msg *snats.Msg) { sec.processNatsMessage(msg.Data, eventSource) }, snats.StartAtTime(startTime)) } @@ -103,12 +107,12 @@ func (sec *sensorExecutionCtx) getNatsStreamingSubscription(eventSource string) if err != nil { return nil, err } - return sec.nconn.stream.Subscribe(eventSource, func(msg *snats.Msg) { + return sec.nconn.stream.QueueSubscribe(eventSource, common.DefaultNatsQueueName(eventSource), func(msg *snats.Msg) { sec.processNatsMessage(msg.Data, eventSource) }, snats.StartAtTimeDelta(duration)) } - return sec.nconn.stream.Subscribe(eventSource, func(msg *snats.Msg) { + return sec.nconn.stream.QueueSubscribe(eventSource, common.DefaultNatsQueueName(eventSource), func(msg *snats.Msg) { sec.processNatsMessage(msg.Data, eventSource) }) } From 4f0a39d8affa556f49bcd293a6e8753dc75462d2 Mon Sep 17 00:00:00 2001 From: vpage Date: Sat, 19 Jan 2019 11:21:03 -0500 Subject: [PATCH 07/22] Fire K8s event on nats connection/subscription updates --- sensors/event-handler.go | 42 +++++-------------- sensors/nats-events-handler.go | 75 ++++++++++++++++++++++++++++++++++ sensors/sync.go | 4 +- 3 files changed, 88 insertions(+), 33 deletions(-) diff --git a/sensors/event-handler.go b/sensors/event-handler.go index 42d96c638d..017f873c8d 100644 --- a/sensors/event-handler.go +++ b/sensors/event-handler.go @@ -29,32 +29,6 @@ import ( ss_v1alpha1 "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" ) -// simple check to make sure two event dependencies list are equal -func EqualEventDependencies(a, b []v1alpha1.EventDependency) bool { - if len(a) != len(b) { - return false - } - for i, v := range a { - if v != b[i] { - return false - } - } - return true -} - -// simple check to make sure two triggers list are equal -func EqualTriggers(a, b []v1alpha1.Trigger) bool { - if len(a) != len(b) { - return false - } - for i, v := range a { - if v != b[i] { - return false - } - } - return true -} - // processUpdateNotification processes event received by sensor, validates it, updates the state of the node representing the event dependency func (sec *sensorExecutionCtx) processUpdateNotification(ew *updateNotification) { defer func() { @@ -166,11 +140,8 @@ func (sec *sensorExecutionCtx) WatchEventsFromGateways() { } }() - go func() { - if _, err := sec.syncSensor(context.Background()); err != nil { - sec.log.Error().Err(err).Msg("failed to sync sensor resource") - } - }() + // sync sensor resource after updates + go sec.syncSensor(context.Background()) switch sec.sensor.Spec.EventProtocol.Type { case v1alpha1.HTTP: @@ -180,7 +151,16 @@ func (sec *sensorExecutionCtx) WatchEventsFromGateways() { var err error if sec.sensor, err = sn.PersistUpdates(sec.sensorClient, sec.sensor, sec.controllerInstanceID, &sec.log); err != nil { sec.log.Error().Err(err).Msg("failed to persist sensor update") + labels := map[string]string{ + common.LabelEventType: string(common.OperationFailureEventType), + common.LabelSensorName: sec.sensor.Name, + common.LabelOperation: "persist_after_nats_conn_update_failure", + } + if err := common.GenerateK8sEvent(sec.kubeClient, "persist updates nats connection update failed", common.OperationFailureEventType, "persist updates nats connection update", sec.sensor.Name, sec.sensor.Namespace, sec.controllerInstanceID, sensor.Kind, labels); err != nil { + sec.log.Error().Err(err).Msg("failed to create K8s event to log persist updates nats connection update failure") + } } + select {} } } diff --git a/sensors/nats-events-handler.go b/sensors/nats-events-handler.go index db9e74b9c4..9b973089a8 100644 --- a/sensors/nats-events-handler.go +++ b/sensors/nats-events-handler.go @@ -1,6 +1,23 @@ +/* +Copyright 2018 BlackRock, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package sensors import ( + "github.com/argoproj/argo-events/pkg/apis/sensor" "strconv" "time" @@ -10,6 +27,54 @@ import ( snats "github.com/nats-io/go-nats-streaming" ) +func (sec *sensorExecutionCtx) successNatsConnection() { + labels := map[string]string{ + common.LabelEventType: string(common.OperationSuccessEventType), + common.LabelSensorName: sec.sensor.Name, + common.LabelOperation: "nats_connection_setup", + } + if err := common.GenerateK8sEvent(sec.kubeClient, "connection setup successfully", common.OperationSuccessEventType, "connection setup", sec.sensor.Name, sec.sensor.Namespace, sec.controllerInstanceID, sensor.Kind, labels); err != nil { + sec.log.Error().Err(err).Msg("failed to create K8s event to log nats connection setup success") + } +} + +func (sec *sensorExecutionCtx) escalateNatsConnectionFailure() { + // escalate error + labels := map[string]string{ + common.LabelEventType: string(common.EscalationEventType), + common.LabelSensorName: sec.sensor.Name, + common.LabelOperation: "nats_connection_setup", + } + if err := common.GenerateK8sEvent(sec.kubeClient, "connection setup failed", common.EscalationEventType, "connection setup", sec.sensor.Name, sec.sensor.Namespace, sec.controllerInstanceID, sensor.Kind, labels); err != nil { + sec.log.Error().Err(err).Msg("failed to create K8s event to log nats connection setup error") + } +} + +func (sec *sensorExecutionCtx) successNatsSubscription(eventSource string) { + labels := map[string]string{ + common.LabelEventType: string(common.OperationSuccessEventType), + common.LabelSensorName: sec.sensor.Name, + common.LabelEventSource: eventSource, + common.LabelOperation: "nats_subscription_success", + } + if err := common.GenerateK8sEvent(sec.kubeClient, "nats subscription success", common.OperationSuccessEventType, "subscription setup", sec.sensor.Name, sec.sensor.Namespace, sec.controllerInstanceID, sensor.Kind, labels); err != nil { + sec.log.Error().Err(err).Msg("failed to create K8s event to log nats subscription success") + } +} + +func (sec *sensorExecutionCtx) escalateNatsSubscriptionFailure(eventSource string) { + // escalate error + labels := map[string]string{ + common.LabelEventType: string(common.OperationFailureEventType), + common.LabelSensorName: sec.sensor.Name, + common.LabelEventSource: eventSource, + common.LabelOperation: "nats_subscription_failure", + } + if err := common.GenerateK8sEvent(sec.kubeClient, "nats subscription failed", common.OperationFailureEventType, "subscription setup", sec.sensor.Name, sec.sensor.Namespace, sec.controllerInstanceID, sensor.Kind, labels); err != nil { + sec.log.Error().Err(err).Msg("failed to create K8s event to log nats subscription error") + } +} + // NatsEventProtocol handles events sent over NATS // Queue subscription is used because lets say sensor is running with couple of dependencies and the subscription is // established for them and then sensor resource failed to persist updates. So for the next sensor resource update, the dependency connected @@ -23,34 +88,44 @@ func (sec *sensorExecutionCtx) NatsEventProtocol() { if sec.nconn.standard == nil { sec.nconn.standard, err = nats.Connect(sec.sensor.Spec.EventProtocol.Nats.URL) if err != nil { + sec.escalateNatsConnectionFailure() sec.log.Panic().Err(err).Msg("failed to connect to nats server") } + sec.successNatsConnection() } for _, dependency := range sec.sensor.Spec.Dependencies { if dependency.Connected { continue } if _, err := sec.getNatsStandardSubscription(dependency.Name); err != nil { + sec.escalateNatsSubscriptionFailure(dependency.Name) sec.log.Error().Err(err).Str("event-source-name", dependency.Name).Msg("failed to get the nats subscription") + continue } dependency.Connected = true + sec.successNatsSubscription(dependency.Name) } case v1alpha1.Streaming: if sec.nconn.stream == nil { sec.nconn.stream, err = snats.Connect(sec.sensor.Spec.EventProtocol.Nats.ClusterId, sec.sensor.Spec.EventProtocol.Nats.ClientId, snats.NatsURL(sec.sensor.Spec.EventProtocol.Nats.URL)) if err != nil { + sec.escalateNatsConnectionFailure() sec.log.Panic().Err(err).Msg("failed to connect to nats streaming server") } + sec.successNatsConnection() } for _, dependency := range sec.sensor.Spec.Dependencies { if dependency.Connected { continue } if _, err := sec.getNatsStreamingSubscription(dependency.Name); err != nil { + sec.escalateNatsSubscriptionFailure(dependency.Name) sec.log.Error().Err(err).Str("event-source-name", dependency.Name).Msg("failed to get the nats subscription") + continue } dependency.Connected = true + sec.successNatsSubscription(dependency.Name) } } } diff --git a/sensors/sync.go b/sensors/sync.go index 82297b678e..310d6c07ed 100644 --- a/sensors/sync.go +++ b/sensors/sync.go @@ -29,7 +29,7 @@ import ( ) // resyncs the sensor object for status updates -func (se *sensorExecutionCtx) syncSensor(ctx context.Context) (cache.Controller, error) { +func (se *sensorExecutionCtx) syncSensor(ctx context.Context) cache.Controller { se.log.Info().Msg("watching sensor updates") source := se.newSensorWatch() _, controller := cache.NewInformer( @@ -48,7 +48,7 @@ func (se *sensorExecutionCtx) syncSensor(ctx context.Context) (cache.Controller, }) go controller.Run(ctx.Done()) - return controller, nil + return controller } func (se *sensorExecutionCtx) newSensorWatch() *cache.ListWatch { From 6336aaa1212454e1b6a11d37ec70d103e27a39bb Mon Sep 17 00:00:00 2001 From: vpage Date: Tue, 22 Jan 2019 12:27:37 -0500 Subject: [PATCH 08/22] Updating gateway and sensor controller validate method --- Gopkg.lock | 23 +- Gopkg.toml | 6 +- common/common.go | 3 - controllers/gateway/validate.go | 9 +- controllers/sensor/Dockerfile | 4 +- controllers/sensor/operator.go | 10 +- controllers/sensor/state.go | 4 - controllers/sensor/validate.go | 15 + gateways/config.go | 1 + gateways/transformer.go | 9 +- pkg/apis/gateway/v1alpha1/generated.pb.go | 175 +++---- pkg/apis/gateway/v1alpha1/generated.proto | 1 + pkg/apis/sensor/v1alpha1/generated.pb.go | 435 ++++++++++-------- pkg/apis/sensor/v1alpha1/generated.proto | 21 +- pkg/apis/sensor/v1alpha1/openapi_generated.go | 91 +++- .../gateway/clientset/versioned/clientset.go | 2 + .../versioned/fake/clientset_generated.go | 9 +- .../clientset/versioned/fake/register.go | 16 +- .../clientset/versioned/scheme/register.go | 16 +- .../gateway/v1alpha1/fake/fake_gateway.go | 2 +- .../informers/externalversions/factory.go | 61 +-- .../sensor/clientset/versioned/clientset.go | 2 + .../versioned/fake/clientset_generated.go | 9 +- .../clientset/versioned/fake/register.go | 16 +- .../clientset/versioned/scheme/register.go | 16 +- .../typed/sensor/v1alpha1/fake/fake_sensor.go | 2 +- .../informers/externalversions/factory.go | 61 +-- sensors/cmd/Dockerfile | 4 +- sensors/http-events-handler.go | 4 +- sensors/nats-events-handler.go | 17 +- 30 files changed, 533 insertions(+), 511 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 9051b01ccf..6ec5d151d2 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -461,7 +461,7 @@ "ed25519/internal/edwards25519", "ssh/terminal" ] - revision = "ff983b9c42bc9fbf91556e191cc8efb585c16908" + revision = "64072686203f69e3fd20143576b27200f18ab0fa" [[projects]] branch = "master" @@ -480,7 +480,7 @@ "trace", "websocket" ] - revision = "915654e7eabcea33ae277abbecf52f0d8b7a9fdc" + revision = "ed066c81e75eba56dd9bd2139ade88125b855585" [[projects]] branch = "master" @@ -499,7 +499,7 @@ "unix", "windows" ] - revision = "11f53e03133963fb11ae0588e08b5e0b85be8be5" + revision = "054c452bb702e465e95ce8e7a3d9a6cf0cd1188d" [[projects]] name = "golang.org/x/text" @@ -545,7 +545,7 @@ "internal/gopathwalk", "internal/semver" ] - revision = "16909d206f00da7d0d5ba28cd9dc7fb223648ecf" + revision = "24cd39ecf74570612483b772d45cf9d53d908340" [[projects]] name = "google.golang.org/appengine" @@ -618,7 +618,7 @@ version = "v2.2.2" [[projects]] - branch = "release-1.12" + branch = "release-1.10" name = "k8s.io/api" packages = [ "admissionregistration/v1alpha1", @@ -650,10 +650,10 @@ "storage/v1alpha1", "storage/v1beta1" ] - revision = "6db15a15d2d3874a6c3ddb2140ac9f3bc7058428" + revision = "c89978d5f86d7427bef2fc7752732c8c60b1d188" [[projects]] - branch = "release-1.12" + branch = "release-1.10" name = "k8s.io/apimachinery" packages = [ "pkg/api/errors", @@ -684,7 +684,6 @@ "pkg/util/framer", "pkg/util/intstr", "pkg/util/json", - "pkg/util/naming", "pkg/util/net", "pkg/util/runtime", "pkg/util/sets", @@ -696,7 +695,7 @@ "pkg/watch", "third_party/forked/golang/reflect" ] - revision = "49ce2735e5074ffc3f8190c8406cf51a96302dad" + revision = "d49e237a2683fa6dc43a86c7b1b766e0219fb6e7" [[projects]] branch = "release-7.0" @@ -792,7 +791,7 @@ revision = "36368dede29baa5ecd253416d70ddc0c76bde69b" [[projects]] - branch = "release-1.12" + branch = "release-1.10" name = "k8s.io/code-generator" packages = [ "cmd/client-gen", @@ -821,7 +820,7 @@ "pkg/util", "third_party/forked/golang/reflect" ] - revision = "b1289fc74931d4b6b04bd1a259acfc88a2cb0a66" + revision = "edc41f23fa918716df540b1486477d62237010e4" [[projects]] branch = "master" @@ -859,6 +858,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "7b07bc2e199faf8ba2c6fe985f78c1a65564dfcb077228e28f723aab5af83e7d" + inputs-digest = "28bc456cb7b54760f5cc30572c5b3bdb1ded4ca0cf62c7968f8b1236c0f75172" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 0974228d32..81fbb362a3 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -14,7 +14,7 @@ required = [ [[constraint]] name = "k8s.io/code-generator" - branch = "release-1.12" + branch = "release-1.10" [[constraint]] name = "github.com/nats-io/go-nats-streaming" @@ -77,11 +77,11 @@ required = [ branch = "master" [[override]] - branch = "release-1.12" + branch = "release-1.10" name = "k8s.io/api" [[override]] - branch = "release-1.12" + branch = "release-1.10" name = "k8s.io/apimachinery" [[override]] diff --git a/common/common.go b/common/common.go index 50e37634d1..de3f91d55f 100644 --- a/common/common.go +++ b/common/common.go @@ -64,9 +64,6 @@ const ( // SENSOR CONSTANTS const ( - // Sensor service port - SensorServicePort = "9300" - // SensorServiceEndpoint is the endpoint to dispatch the event to SensorServiceEndpoint = "/" diff --git a/controllers/gateway/validate.go b/controllers/gateway/validate.go index fd4babdac7..6573048081 100644 --- a/controllers/gateway/validate.go +++ b/controllers/gateway/validate.go @@ -33,13 +33,18 @@ func Validate(gw *v1alpha1.Gateway) error { if gw.Spec.EventVersion == "" { return fmt.Errorf("gateway version is not specified") } - switch gw.Spec.DispatchProtocol { + switch gw.Spec.DispatchProtocol.Type { case v1alpha1.HTTPGateway: if gw.Spec.Watchers == nil || (gw.Spec.Watchers.Gateways == nil && gw.Spec.Watchers.Sensors == nil) { return fmt.Errorf("no associated watchers with gateway") } + if gw.Spec.DispatchProtocol.Http.Port == "" { + return fmt.Errorf("http server port is not defined") + } case v1alpha1.NATSGateway: - case v1alpha1.KafkaGateway: + if gw.Spec.DispatchProtocol.Nats.URL == "" { + return fmt.Errorf("nats url is not defined") + } default: return fmt.Errorf("unknown gateway type") } diff --git a/controllers/sensor/Dockerfile b/controllers/sensor/Dockerfile index c677f86e77..9c2e0f7834 100644 --- a/controllers/sensor/Dockerfile +++ b/controllers/sensor/Dockerfile @@ -1,3 +1,3 @@ FROM centos:7 -COPY dist/sn-controller /bin/ -ENTRYPOINT [ "/bin/sn-controller" ] \ No newline at end of file +COPY dist/sensor-controller /bin/ +ENTRYPOINT [ "/bin/sensor-controller" ] \ No newline at end of file diff --git a/controllers/sensor/operator.go b/controllers/sensor/operator.go index 03e2f7fe5c..3ade020882 100644 --- a/controllers/sensor/operator.go +++ b/controllers/sensor/operator.go @@ -152,10 +152,8 @@ func (soc *sOperationCtx) operate() error { } soc.log.Info().Msg("sensor pod created") - // Create a ClusterIP service to expose sensor in cluster - // For now, sensor will receive event notifications through http server. - _, err = soc.controller.kubeClientset.CoreV1().Services(soc.s.Namespace).Get(common.DefaultServiceName(soc.s.Name), metav1.GetOptions{}) - if err != nil && apierr.IsNotFound(err) { + // Create a ClusterIP service to expose sensor in cluster if the event protocol type is HTTP + if _, err = soc.controller.kubeClientset.CoreV1().Services(soc.s.Namespace).Get(common.DefaultServiceName(soc.s.Name), metav1.GetOptions{}); err != nil && apierr.IsNotFound(err) && soc.s.Spec.EventProtocol.Type == v1alpha1.HTTP { // Create sensor service sensorSvc := &corev1.Service{ ObjectMeta: metav1.ObjectMeta{ @@ -168,8 +166,8 @@ func (soc *sOperationCtx) operate() error { Spec: corev1.ServiceSpec{ Ports: []corev1.ServicePort{ { - Port: intstr.Parse(common.SensorServicePort).IntVal, - TargetPort: intstr.FromInt(int(intstr.Parse(common.SensorServicePort).IntVal)), + Port: intstr.Parse(soc.s.Spec.EventProtocol.Http.Port).IntVal, + TargetPort: intstr.FromInt(int(intstr.Parse(soc.s.Spec.EventProtocol.Http.Port).IntVal)), }, }, Type: corev1.ServiceTypeClusterIP, diff --git a/controllers/sensor/state.go b/controllers/sensor/state.go index 13593f205c..63b2a6da7b 100644 --- a/controllers/sensor/state.go +++ b/controllers/sensor/state.go @@ -17,7 +17,6 @@ limitations under the License. package sensor import ( - "fmt" "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" "time" @@ -33,7 +32,6 @@ import ( // for events this node name should be the name of the event func GetNodeByName(sensor *v1alpha1.Sensor, nodeName string) *v1alpha1.NodeStatus { nodeID := sensor.NodeID(nodeName) - fmt.Println(nodeID) node, ok := sensor.Status.Nodes[nodeID] if !ok { return nil @@ -109,9 +107,7 @@ func ReapplyUpdate(sensorClient sclient.Interface, sensor *v1alpha1.Sensor) erro // MarkNodePhase marks the node with a phase, returns the node func MarkNodePhase(sensor *v1alpha1.Sensor, nodeName string, nodeType v1alpha1.NodeType, phase v1alpha1.NodePhase, event *v1alpha1.Event, log *zerolog.Logger, message ...string) *v1alpha1.NodeStatus { - fmt.Println(nodeName) node := GetNodeByName(sensor, nodeName) - fmt.Println(sensor.Status.Nodes) if node.Phase != phase { log.Info().Str("type", string(node.Type)).Str("node-name", node.Name).Str("phase", string(node.Phase)) node.Phase = phase diff --git a/controllers/sensor/validate.go b/controllers/sensor/validate.go index 720de21671..1b44d0687e 100644 --- a/controllers/sensor/validate.go +++ b/controllers/sensor/validate.go @@ -39,6 +39,21 @@ func ValidateSensor(s *v1alpha1.Sensor) error { if len(s.Spec.DeploySpec.Containers) > 1 { return fmt.Errorf("sensor pod specification can't have more than one container") } + switch s.Spec.EventProtocol.Type { + case v1alpha1.HTTP: + if s.Spec.EventProtocol.Http.Port == "" { + return fmt.Errorf("http server port is not defined") + } + case v1alpha1.NATS: + if s.Spec.EventProtocol.Nats.URL == "" { + return fmt.Errorf("nats url is not defined") + } + if s.Spec.EventProtocol.Nats.Type == "" { + return fmt.Errorf("nats type is not defined. either Standard or Streaming type should be defined") + } + default: + return fmt.Errorf("unknown gateway type") + } return nil } diff --git a/gateways/config.go b/gateways/config.go index 241cd95eb6..400bdbe0a1 100644 --- a/gateways/config.go +++ b/gateways/config.go @@ -155,6 +155,7 @@ func NewGatewayConfiguration() *GatewayConfig { if gc.natsConn, err = nats.Connect(gw.Spec.DispatchProtocol.Nats.URL); err != nil { panic(fmt.Errorf("failed to connect to NATS cluster. err: %+v", err)) } + gc.Log.Info().Str("nats-url", gw.Spec.DispatchProtocol.Nats.URL).Msg("connected to nats") } return gc } diff --git a/gateways/transformer.go b/gateways/transformer.go index e5ac255a41..5c186f3ed8 100644 --- a/gateways/transformer.go +++ b/gateways/transformer.go @@ -56,6 +56,9 @@ func (gc *GatewayConfig) DispatchEvent(gatewayEvent *Event) error { return err } case v1alpha1.NATSGateway: + if err = gc.dispatchEventOverNats(transformedEvent.Context.Source.Host, payload); err != nil { + return err + } default: return fmt.Errorf("unknown dispatch mechanism %s", gc.gw.Spec.DispatchProtocol) } @@ -96,7 +99,7 @@ func (gc *GatewayConfig) dispatchEventOverHttp(source string, eventPayload []byt gc.Log.Info().Str("source", source).Msg("dispatching event to watchers") for _, sensor := range gc.gw.Spec.Watchers.Sensors { - if err := gc.postCloudEventToWatcher(common.DefaultServiceName(sensor.Name), common.SensorServicePort, common.SensorServiceEndpoint, eventPayload); err != nil { + if err := gc.postCloudEventToWatcher(common.DefaultServiceName(sensor.Name), gc.gw.Spec.DispatchProtocol.Http.Port, common.SensorServiceEndpoint, eventPayload); err != nil { return fmt.Errorf("failed to dispatch event to sensor watcher over http. communication error. err: %+v", err) } } @@ -109,8 +112,8 @@ func (gc *GatewayConfig) dispatchEventOverHttp(source string, eventPayload []byt return nil } -// dispatchEventOverNats dispatches event over nats streaming -func (gc *GatewayConfig) dispatchEventOverNatsStreaming(source string, eventPayload []byte) error { +// dispatchEventOverNats dispatches event over nats +func (gc *GatewayConfig) dispatchEventOverNats(source string, eventPayload []byte) error { if err := gc.natsConn.Publish(source, eventPayload); err != nil { gc.Log.Error().Err(err).Str("source", source).Msg("failed to publish event") return err diff --git a/pkg/apis/gateway/v1alpha1/generated.pb.go b/pkg/apis/gateway/v1alpha1/generated.pb.go index 1124a2ed39..e10beeb044 100644 --- a/pkg/apis/gateway/v1alpha1/generated.pb.go +++ b/pkg/apis/gateway/v1alpha1/generated.pb.go @@ -44,7 +44,7 @@ const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package func (m *DispatchProtocol) Reset() { *m = DispatchProtocol{} } func (*DispatchProtocol) ProtoMessage() {} func (*DispatchProtocol) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_2651be823c5242a7, []int{0} + return fileDescriptor_generated_a2bfb65c2618fd75, []int{0} } func (m *DispatchProtocol) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -72,7 +72,7 @@ var xxx_messageInfo_DispatchProtocol proto.InternalMessageInfo func (m *Gateway) Reset() { *m = Gateway{} } func (*Gateway) ProtoMessage() {} func (*Gateway) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_2651be823c5242a7, []int{1} + return fileDescriptor_generated_a2bfb65c2618fd75, []int{1} } func (m *Gateway) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -100,7 +100,7 @@ var xxx_messageInfo_Gateway proto.InternalMessageInfo func (m *GatewayList) Reset() { *m = GatewayList{} } func (*GatewayList) ProtoMessage() {} func (*GatewayList) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_2651be823c5242a7, []int{2} + return fileDescriptor_generated_a2bfb65c2618fd75, []int{2} } func (m *GatewayList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -128,7 +128,7 @@ var xxx_messageInfo_GatewayList proto.InternalMessageInfo func (m *GatewayNotificationWatcher) Reset() { *m = GatewayNotificationWatcher{} } func (*GatewayNotificationWatcher) ProtoMessage() {} func (*GatewayNotificationWatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_2651be823c5242a7, []int{3} + return fileDescriptor_generated_a2bfb65c2618fd75, []int{3} } func (m *GatewayNotificationWatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -156,7 +156,7 @@ var xxx_messageInfo_GatewayNotificationWatcher proto.InternalMessageInfo func (m *GatewaySpec) Reset() { *m = GatewaySpec{} } func (*GatewaySpec) ProtoMessage() {} func (*GatewaySpec) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_2651be823c5242a7, []int{4} + return fileDescriptor_generated_a2bfb65c2618fd75, []int{4} } func (m *GatewaySpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -184,7 +184,7 @@ var xxx_messageInfo_GatewaySpec proto.InternalMessageInfo func (m *GatewayStatus) Reset() { *m = GatewayStatus{} } func (*GatewayStatus) ProtoMessage() {} func (*GatewayStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_2651be823c5242a7, []int{5} + return fileDescriptor_generated_a2bfb65c2618fd75, []int{5} } func (m *GatewayStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -212,7 +212,7 @@ var xxx_messageInfo_GatewayStatus proto.InternalMessageInfo func (m *Http) Reset() { *m = Http{} } func (*Http) ProtoMessage() {} func (*Http) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_2651be823c5242a7, []int{6} + return fileDescriptor_generated_a2bfb65c2618fd75, []int{6} } func (m *Http) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -240,7 +240,7 @@ var xxx_messageInfo_Http proto.InternalMessageInfo func (m *Nats) Reset() { *m = Nats{} } func (*Nats) ProtoMessage() {} func (*Nats) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_2651be823c5242a7, []int{7} + return fileDescriptor_generated_a2bfb65c2618fd75, []int{7} } func (m *Nats) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -268,7 +268,7 @@ var xxx_messageInfo_Nats proto.InternalMessageInfo func (m *NodeStatus) Reset() { *m = NodeStatus{} } func (*NodeStatus) ProtoMessage() {} func (*NodeStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_2651be823c5242a7, []int{8} + return fileDescriptor_generated_a2bfb65c2618fd75, []int{8} } func (m *NodeStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -296,7 +296,7 @@ var xxx_messageInfo_NodeStatus proto.InternalMessageInfo func (m *NotificationWatchers) Reset() { *m = NotificationWatchers{} } func (*NotificationWatchers) ProtoMessage() {} func (*NotificationWatchers) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_2651be823c5242a7, []int{9} + return fileDescriptor_generated_a2bfb65c2618fd75, []int{9} } func (m *NotificationWatchers) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -324,7 +324,7 @@ var xxx_messageInfo_NotificationWatchers proto.InternalMessageInfo func (m *SensorNotificationWatcher) Reset() { *m = SensorNotificationWatcher{} } func (*SensorNotificationWatcher) ProtoMessage() {} func (*SensorNotificationWatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_2651be823c5242a7, []int{10} + return fileDescriptor_generated_a2bfb65c2618fd75, []int{10} } func (m *SensorNotificationWatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2971,80 +2971,81 @@ var ( ) func init() { - proto.RegisterFile("github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1/generated.proto", fileDescriptor_generated_2651be823c5242a7) -} - -var fileDescriptor_generated_2651be823c5242a7 = []byte{ - // 1136 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0xcf, 0x6f, 0x1b, 0x45, - 0x14, 0xce, 0xfa, 0x47, 0x6c, 0x8f, 0x93, 0x36, 0x0c, 0x45, 0x18, 0x23, 0x9c, 0x68, 0x05, 0x52, - 0x40, 0x74, 0xb7, 0x89, 0x00, 0x05, 0x10, 0x42, 0x2c, 0x09, 0x6d, 0x44, 0x93, 0x46, 0xe3, 0x04, - 0x24, 0x8a, 0x44, 0x27, 0xbb, 0x93, 0xf5, 0x36, 0xde, 0x9d, 0xd1, 0xce, 0xd8, 0xc5, 0xa7, 0x22, - 0x71, 0x47, 0xc0, 0x9d, 0x23, 0xff, 0x09, 0x12, 0x39, 0xf6, 0xc0, 0xa1, 0xa7, 0x88, 0x98, 0xff, - 0xa2, 0x17, 0xd0, 0xcc, 0xce, 0xfe, 0x48, 0x9c, 0x28, 0xa1, 0xee, 0x6d, 0xe7, 0xcd, 0xf7, 0xbe, - 0xf7, 0xde, 0x37, 0x6f, 0xde, 0x2c, 0xd8, 0xf4, 0x03, 0xd1, 0x1b, 0xec, 0x5b, 0x2e, 0x0d, 0x6d, - 0x1c, 0xfb, 0x94, 0xc5, 0xf4, 0xa1, 0xfa, 0xb8, 0x49, 0x86, 0x24, 0x12, 0xdc, 0x66, 0x87, 0xbe, - 0x8d, 0x59, 0xc0, 0x6d, 0x1f, 0x0b, 0xf2, 0x08, 0x8f, 0xec, 0xe1, 0x0a, 0xee, 0xb3, 0x1e, 0x5e, - 0xb1, 0x7d, 0x12, 0x91, 0x18, 0x0b, 0xe2, 0x59, 0x2c, 0xa6, 0x82, 0xc2, 0x0f, 0x73, 0x2a, 0x2b, - 0xa5, 0x52, 0x1f, 0xdf, 0x25, 0x54, 0x16, 0x3b, 0xf4, 0x2d, 0x49, 0x65, 0x69, 0x2a, 0x2b, 0xa5, - 0x6a, 0xdf, 0x2c, 0x64, 0xe1, 0x53, 0x9f, 0xda, 0x8a, 0x71, 0x7f, 0x70, 0xa0, 0x56, 0x6a, 0xa1, - 0xbe, 0x92, 0x48, 0x6d, 0xf3, 0x70, 0x8d, 0x5b, 0x01, 0x95, 0x79, 0xd9, 0x2e, 0x8d, 0x89, 0x3d, - 0x9c, 0xc8, 0xa6, 0xfd, 0x5e, 0x8e, 0x09, 0xb1, 0xdb, 0x0b, 0x22, 0x12, 0x8f, 0xf2, 0x62, 0x42, - 0x22, 0xf0, 0x79, 0x5e, 0xf6, 0x45, 0x5e, 0xf1, 0x20, 0x12, 0x41, 0x48, 0x26, 0x1c, 0x3e, 0xb8, - 0xcc, 0x81, 0xbb, 0x3d, 0x12, 0xe2, 0xb3, 0x7e, 0xe6, 0xaf, 0x25, 0xb0, 0xb0, 0x1e, 0x70, 0x86, - 0x85, 0xdb, 0xdb, 0x91, 0x16, 0x97, 0xf6, 0xe1, 0x1a, 0xa8, 0x88, 0x11, 0x23, 0x2d, 0x63, 0xc9, - 0x58, 0x6e, 0x38, 0x6f, 0x1e, 0x1d, 0x2f, 0xce, 0x8c, 0x8f, 0x17, 0x2b, 0xbb, 0x23, 0x46, 0x9e, - 0x1d, 0x2f, 0xde, 0x38, 0x8b, 0x97, 0x76, 0xa4, 0x3c, 0x20, 0x06, 0x95, 0x9e, 0x10, 0xac, 0x55, - 0x5a, 0x32, 0x96, 0x9b, 0xab, 0x9f, 0x5a, 0xcf, 0x7d, 0x14, 0xd6, 0x1d, 0x21, 0x98, 0x33, 0x97, - 0x86, 0x96, 0x2b, 0xa4, 0xa8, 0x65, 0x88, 0x08, 0x0b, 0xde, 0x2a, 0x4f, 0x1d, 0x62, 0x1b, 0x0b, - 0x9e, 0x87, 0x90, 0x2b, 0xa4, 0xa8, 0xcd, 0x3f, 0x4b, 0xa0, 0x76, 0x3b, 0x41, 0xc3, 0x07, 0xa0, - 0x2e, 0x0f, 0xc9, 0xc3, 0x02, 0x2b, 0x3d, 0x9a, 0xab, 0xb7, 0xac, 0x44, 0x6b, 0xab, 0xa8, 0x75, - 0x1e, 0x46, 0xa2, 0xad, 0xe1, 0x8a, 0x75, 0x6f, 0xff, 0x21, 0x71, 0xc5, 0x16, 0x11, 0xd8, 0x81, - 0x3a, 0x06, 0xc8, 0x6d, 0x28, 0x63, 0x85, 0x0c, 0xcc, 0x72, 0x81, 0xc5, 0x80, 0x6b, 0xd5, 0xee, - 0x4c, 0x51, 0x92, 0xce, 0xba, 0xab, 0xf8, 0x9c, 0x6b, 0x3a, 0xee, 0x6c, 0xb2, 0x46, 0x3a, 0x0e, - 0xec, 0x81, 0x0a, 0x67, 0xc4, 0xd5, 0x12, 0x7e, 0xf1, 0x02, 0xe2, 0x31, 0xe2, 0xe6, 0x4a, 0xca, - 0x15, 0x52, 0x11, 0xcc, 0xbf, 0x0c, 0xd0, 0xd4, 0x98, 0xbb, 0x01, 0x17, 0xf0, 0xdb, 0x09, 0x35, - 0xad, 0xab, 0xa9, 0x29, 0xbd, 0x95, 0x96, 0x0b, 0x3a, 0x4a, 0x3d, 0xb5, 0x14, 0x94, 0xf4, 0x41, - 0x35, 0x10, 0x24, 0x94, 0x42, 0x96, 0x97, 0x9b, 0xab, 0xce, 0xf4, 0x85, 0x39, 0xf3, 0x3a, 0x5c, - 0x75, 0x53, 0x12, 0xa3, 0x84, 0xdf, 0xfc, 0xc9, 0x00, 0x6d, 0x8d, 0xd8, 0xa6, 0x22, 0x38, 0x08, - 0x5c, 0x2c, 0x02, 0x1a, 0x7d, 0x2d, 0x6f, 0x05, 0x89, 0xe1, 0x92, 0x6c, 0xd1, 0x30, 0xbd, 0x3f, - 0x85, 0x0e, 0x0b, 0x09, 0x52, 0x3b, 0x12, 0xc1, 0x68, 0x2c, 0xd4, 0x89, 0x17, 0x10, 0x3b, 0x34, - 0x16, 0x48, 0xed, 0xc0, 0x77, 0x41, 0x9d, 0x44, 0x1e, 0xa3, 0x41, 0x24, 0xd4, 0x39, 0x35, 0xf2, - 0xca, 0x37, 0xb4, 0x1d, 0x65, 0x08, 0xf3, 0xdf, 0x4a, 0xa6, 0xb3, 0x54, 0x1f, 0xde, 0x06, 0xc0, - 0x23, 0xac, 0x4f, 0xd5, 0x4a, 0x2b, 0xfd, 0x6a, 0x41, 0x69, 0x4b, 0x8e, 0x2b, 0xa9, 0xeb, 0x0e, - 0xf5, 0x9c, 0x6b, 0xb2, 0x35, 0xd7, 0x33, 0x38, 0x2a, 0xb8, 0x42, 0x1b, 0x34, 0x5c, 0x1a, 0x1d, - 0x04, 0x7e, 0x88, 0x99, 0xce, 0xf6, 0x25, 0x9d, 0x47, 0xe3, 0x73, 0xb5, 0xb1, 0x85, 0x19, 0xca, - 0x31, 0xb2, 0x32, 0x35, 0x3b, 0xca, 0xa7, 0x2b, 0x2b, 0xcc, 0x88, 0x35, 0x30, 0xa7, 0xe4, 0xff, - 0x8a, 0xc4, 0x3c, 0xa0, 0x51, 0xab, 0xa2, 0x90, 0x37, 0x34, 0x72, 0x6e, 0xa3, 0xb0, 0x87, 0x4e, - 0x21, 0xe1, 0x36, 0x68, 0x72, 0x12, 0x0f, 0x03, 0x97, 0xa8, 0xb2, 0xaa, 0xaa, 0xac, 0xd7, 0xcf, - 0x2b, 0xab, 0x9b, 0xc0, 0x9c, 0xeb, 0xe3, 0xe3, 0xc5, 0x66, 0x37, 0xf7, 0x41, 0x45, 0x02, 0x38, - 0x02, 0xf5, 0x47, 0xc9, 0x91, 0xf1, 0xd6, 0xac, 0x22, 0xbb, 0x37, 0xcd, 0x38, 0x99, 0xec, 0x04, - 0xee, 0xcc, 0xc9, 0x03, 0x4b, 0x57, 0x28, 0x0b, 0x07, 0x3f, 0x06, 0xf3, 0x2c, 0xa6, 0x2e, 0xe1, - 0x9c, 0xc6, 0xf2, 0xd4, 0x5b, 0x35, 0xa5, 0xc2, 0x2b, 0x5a, 0x85, 0xf9, 0x9d, 0xe2, 0x26, 0x3a, - 0x8d, 0x85, 0xbf, 0x18, 0x60, 0xc1, 0x3b, 0x33, 0x84, 0x5b, 0x75, 0x55, 0xc0, 0x97, 0x53, 0x14, - 0x70, 0x76, 0xae, 0x3b, 0x2d, 0x9d, 0xcd, 0xc4, 0x0b, 0x81, 0x26, 0xc2, 0x9b, 0x7f, 0x94, 0xc1, - 0xfc, 0xa9, 0xe9, 0x03, 0x6f, 0x81, 0x2a, 0xeb, 0x61, 0x9e, 0x5e, 0x83, 0x76, 0x7a, 0x93, 0x76, - 0xa4, 0xf1, 0xd9, 0xf1, 0x62, 0x63, 0x9b, 0x7a, 0x44, 0x2d, 0x50, 0x02, 0x84, 0xf7, 0x41, 0x83, - 0x0b, 0x1c, 0x0b, 0xe2, 0x7d, 0x26, 0xf4, 0x30, 0x7c, 0xe7, 0x6a, 0xe3, 0x61, 0x37, 0x08, 0x49, - 0xde, 0x98, 0xdd, 0x94, 0x04, 0xe5, 0x7c, 0xf0, 0x6d, 0x50, 0x0b, 0x09, 0xe7, 0xd8, 0x27, 0xba, - 0xe3, 0xae, 0x6b, 0x78, 0x6d, 0x2b, 0x31, 0xa3, 0x74, 0x1f, 0x7e, 0x0f, 0xaa, 0x11, 0xf5, 0x08, - 0x6f, 0x55, 0xd5, 0x1c, 0xe9, 0xbe, 0xa8, 0x81, 0x6c, 0xc9, 0x8a, 0xf9, 0x46, 0x24, 0xe2, 0xc2, - 0x60, 0x51, 0x36, 0x94, 0x04, 0x6c, 0x3f, 0x06, 0x20, 0xc7, 0xc0, 0x05, 0x50, 0x3e, 0x24, 0xa3, - 0x44, 0x3f, 0x24, 0x3f, 0xe1, 0x7d, 0x50, 0x1d, 0xe2, 0xfe, 0x80, 0x68, 0x75, 0x36, 0xa6, 0x6a, - 0x57, 0x8f, 0xe8, 0x77, 0x21, 0xe1, 0xfc, 0xa8, 0xb4, 0x66, 0x98, 0xcb, 0x40, 0xbd, 0xb5, 0xd9, - 0x80, 0x32, 0x2e, 0x1a, 0x50, 0xe6, 0x5b, 0x40, 0x3d, 0x99, 0xf0, 0x0d, 0x50, 0x1e, 0xc4, 0x7d, - 0x0d, 0x6c, 0x6a, 0x60, 0x79, 0x0f, 0xdd, 0x45, 0xd2, 0x6e, 0xfe, 0x5e, 0x4e, 0x4a, 0xd2, 0x4d, - 0xd1, 0x06, 0xa5, 0xc0, 0xd3, 0x60, 0xa0, 0xc1, 0xa5, 0xcd, 0x75, 0x54, 0x0a, 0xbc, 0x6c, 0x6c, - 0x96, 0x2f, 0x1c, 0x9b, 0xef, 0x83, 0xa6, 0x6c, 0xbc, 0x3e, 0x1e, 0x49, 0xa3, 0x1a, 0x00, 0x0d, - 0xe7, 0x65, 0x0d, 0x6c, 0xae, 0xe7, 0x5b, 0xa8, 0x88, 0xcb, 0x3b, 0x71, 0xf6, 0xaa, 0x9d, 0xf8, - 0xa0, 0xd8, 0x89, 0x35, 0xa5, 0xb5, 0x7d, 0xb5, 0x4e, 0xdc, 0x0a, 0xdc, 0x98, 0xfe, 0xbf, 0x76, - 0xac, 0x5f, 0xd2, 0x8e, 0x2e, 0x00, 0x03, 0xe6, 0x61, 0x41, 0x24, 0x6d, 0xab, 0xf1, 0x7c, 0xd9, - 0x64, 0xff, 0x20, 0x7b, 0x19, 0x15, 0x2a, 0xd0, 0x9a, 0xbf, 0x95, 0xc0, 0x8d, 0xf3, 0x26, 0x18, - 0xfc, 0xd1, 0x00, 0x75, 0xdd, 0x3c, 0xbc, 0x65, 0xa8, 0x0b, 0xb1, 0x37, 0xfd, 0x85, 0x38, 0x27, - 0x54, 0xfe, 0xc0, 0x69, 0x0c, 0x47, 0x59, 0x60, 0xf8, 0x18, 0xd4, 0x38, 0x89, 0x38, 0x8d, 0xd3, - 0xc7, 0x7d, 0x77, 0x8a, 0x1c, 0xba, 0x8a, 0xe9, 0xbc, 0x14, 0xb2, 0x43, 0x48, 0x20, 0x1c, 0xa5, - 0x51, 0xcd, 0x4f, 0xc0, 0x6b, 0x17, 0xba, 0x5d, 0xfe, 0xe0, 0x3b, 0xd6, 0xd1, 0x49, 0x67, 0xe6, - 0xc9, 0x49, 0x67, 0xe6, 0xe9, 0x49, 0x67, 0xe6, 0x87, 0x71, 0xc7, 0x38, 0x1a, 0x77, 0x8c, 0x27, - 0xe3, 0x8e, 0xf1, 0x74, 0xdc, 0x31, 0xfe, 0x1e, 0x77, 0x8c, 0x9f, 0xff, 0xe9, 0xcc, 0x7c, 0x53, - 0x4f, 0x53, 0xfc, 0x2f, 0x00, 0x00, 0xff, 0xff, 0xd2, 0x87, 0xd3, 0x3b, 0x10, 0x0d, 0x00, 0x00, + proto.RegisterFile("github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1/generated.proto", fileDescriptor_generated_a2bfb65c2618fd75) +} + +var fileDescriptor_generated_a2bfb65c2618fd75 = []byte{ + // 1152 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0xcf, 0x6f, 0x1b, 0xc5, + 0x17, 0xcf, 0xfa, 0x47, 0x6c, 0x8f, 0x93, 0x36, 0xdf, 0xf9, 0x16, 0x61, 0x8c, 0x70, 0xa2, 0x15, + 0x48, 0x01, 0xd1, 0xdd, 0x26, 0xfc, 0x50, 0x00, 0x21, 0xc4, 0x92, 0xd0, 0x46, 0x34, 0x69, 0x34, + 0x4e, 0x40, 0xa2, 0x48, 0x74, 0xb2, 0x3b, 0x59, 0x6f, 0xe3, 0xdd, 0x19, 0xed, 0x8c, 0x5d, 0x7c, + 0x2a, 0x12, 0x77, 0x04, 0xdc, 0x39, 0xf2, 0x9f, 0x20, 0x91, 0x63, 0x0f, 0x1c, 0x7a, 0x8a, 0x88, + 0xf9, 0x2f, 0x7a, 0x01, 0xcd, 0xec, 0xec, 0x8f, 0xc4, 0x89, 0x12, 0xea, 0xde, 0x76, 0xde, 0x7c, + 0xde, 0xe7, 0xbd, 0xf7, 0x99, 0x37, 0x6f, 0x16, 0x6c, 0xfa, 0x81, 0xe8, 0x0d, 0xf6, 0x2d, 0x97, + 0x86, 0x36, 0x8e, 0x7d, 0xca, 0x62, 0xfa, 0x50, 0x7d, 0xdc, 0x24, 0x43, 0x12, 0x09, 0x6e, 0xb3, + 0x43, 0xdf, 0xc6, 0x2c, 0xe0, 0xb6, 0x8f, 0x05, 0x79, 0x84, 0x47, 0xf6, 0x70, 0x05, 0xf7, 0x59, + 0x0f, 0xaf, 0xd8, 0x3e, 0x89, 0x48, 0x8c, 0x05, 0xf1, 0x2c, 0x16, 0x53, 0x41, 0xe1, 0x07, 0x39, + 0x95, 0x95, 0x52, 0xa9, 0x8f, 0x6f, 0x13, 0x2a, 0x8b, 0x1d, 0xfa, 0x96, 0xa4, 0xb2, 0x34, 0x95, + 0x95, 0x52, 0xb5, 0x6f, 0x16, 0xb2, 0xf0, 0xa9, 0x4f, 0x6d, 0xc5, 0xb8, 0x3f, 0x38, 0x50, 0x2b, + 0xb5, 0x50, 0x5f, 0x49, 0xa4, 0xb6, 0x79, 0xb8, 0xc6, 0xad, 0x80, 0xca, 0xbc, 0x6c, 0x97, 0xc6, + 0xc4, 0x1e, 0x4e, 0x64, 0xd3, 0x7e, 0x37, 0xc7, 0x84, 0xd8, 0xed, 0x05, 0x11, 0x89, 0x47, 0x79, + 0x31, 0x21, 0x11, 0xf8, 0x3c, 0x2f, 0xfb, 0x22, 0xaf, 0x78, 0x10, 0x89, 0x20, 0x24, 0x13, 0x0e, + 0xef, 0x5f, 0xe6, 0xc0, 0xdd, 0x1e, 0x09, 0xf1, 0x84, 0xdf, 0x3b, 0x17, 0xf9, 0x0d, 0x44, 0xd0, + 0xb7, 0x83, 0x48, 0x70, 0x11, 0x9f, 0x75, 0x32, 0x7f, 0x29, 0x81, 0x85, 0xf5, 0x80, 0x33, 0x2c, + 0xdc, 0xde, 0x8e, 0xb4, 0xb8, 0xb4, 0x0f, 0xd7, 0x40, 0x45, 0x8c, 0x18, 0x69, 0x19, 0x4b, 0xc6, + 0x72, 0xc3, 0x79, 0xfd, 0xe8, 0x78, 0x71, 0x66, 0x7c, 0xbc, 0x58, 0xd9, 0x1d, 0x31, 0xf2, 0xec, + 0x78, 0xf1, 0xc6, 0x59, 0xbc, 0xb4, 0x23, 0xe5, 0x01, 0x31, 0xa8, 0xf4, 0x84, 0x60, 0xad, 0xd2, + 0x92, 0xb1, 0xdc, 0x5c, 0xfd, 0xc4, 0x7a, 0xee, 0xf3, 0xb3, 0xee, 0x08, 0xc1, 0x9c, 0xb9, 0x34, + 0xb4, 0x5c, 0x21, 0x45, 0x2d, 0x43, 0x44, 0x58, 0xf0, 0x56, 0x79, 0xea, 0x10, 0xdb, 0x58, 0xf0, + 0x3c, 0x84, 0x5c, 0x21, 0x45, 0x6d, 0xfe, 0x51, 0x02, 0xb5, 0xdb, 0x09, 0x1a, 0x3e, 0x00, 0x75, + 0x79, 0xb2, 0x1e, 0x16, 0x58, 0xe9, 0xd1, 0x5c, 0xbd, 0x65, 0x25, 0x42, 0x5b, 0x45, 0xa1, 0xf3, + 0x30, 0x12, 0x6d, 0x0d, 0x57, 0xac, 0x7b, 0xfb, 0x0f, 0x89, 0x2b, 0xb6, 0x88, 0xc0, 0x0e, 0xd4, + 0x31, 0x40, 0x6e, 0x43, 0x19, 0x2b, 0x64, 0x60, 0x96, 0x0b, 0x2c, 0x06, 0x5c, 0xab, 0x76, 0x67, + 0x8a, 0x92, 0x74, 0xd6, 0x5d, 0xc5, 0xe7, 0x5c, 0xd3, 0x71, 0x67, 0x93, 0x35, 0xd2, 0x71, 0x60, + 0x0f, 0x54, 0x38, 0x23, 0xae, 0x96, 0xf0, 0xf3, 0x17, 0x10, 0x8f, 0x11, 0x37, 0x57, 0x52, 0xae, + 0x90, 0x8a, 0x60, 0xfe, 0x69, 0x80, 0xa6, 0xc6, 0xdc, 0x0d, 0xb8, 0x80, 0xdf, 0x4c, 0xa8, 0x69, + 0x5d, 0x4d, 0x4d, 0xe9, 0xad, 0xb4, 0x5c, 0xd0, 0x51, 0xea, 0xa9, 0xa5, 0xa0, 0xa4, 0x0f, 0xaa, + 0x81, 0x20, 0xa1, 0x14, 0xb2, 0xbc, 0xdc, 0x5c, 0x75, 0xa6, 0x2f, 0xcc, 0x99, 0xd7, 0xe1, 0xaa, + 0x9b, 0x92, 0x18, 0x25, 0xfc, 0xe6, 0x8f, 0x06, 0x68, 0x6b, 0xc4, 0x36, 0x15, 0xc1, 0x41, 0xe0, + 0x62, 0x11, 0xd0, 0xe8, 0x2b, 0x79, 0x2b, 0x48, 0x0c, 0x97, 0x64, 0x8b, 0x86, 0xe9, 0xfd, 0x29, + 0x74, 0x58, 0x48, 0x90, 0xda, 0x91, 0x08, 0x46, 0x63, 0xa1, 0x4e, 0xbc, 0x80, 0xd8, 0xa1, 0xb1, + 0x40, 0x6a, 0x07, 0xbe, 0x0d, 0xea, 0x24, 0xf2, 0x18, 0x0d, 0x22, 0xa1, 0xce, 0xa9, 0x91, 0x57, + 0xbe, 0xa1, 0xed, 0x28, 0x43, 0x98, 0xff, 0x54, 0x32, 0x9d, 0xa5, 0xfa, 0xf0, 0x36, 0x00, 0x1e, + 0x61, 0x7d, 0xaa, 0x56, 0x5a, 0xe9, 0x97, 0x0b, 0x4a, 0x5b, 0x72, 0xc6, 0x49, 0x5d, 0x77, 0xa8, + 0xe7, 0x5c, 0x93, 0xad, 0xb9, 0x9e, 0xc1, 0x51, 0xc1, 0x15, 0xda, 0xa0, 0xe1, 0xd2, 0xe8, 0x20, + 0xf0, 0x43, 0xcc, 0x74, 0xb6, 0xff, 0xd3, 0x79, 0x34, 0x3e, 0x53, 0x1b, 0x5b, 0x98, 0xa1, 0x1c, + 0x23, 0x2b, 0x53, 0xb3, 0xa3, 0x7c, 0xba, 0xb2, 0xc2, 0x8c, 0x58, 0x03, 0x73, 0x4a, 0xfe, 0x2f, + 0x49, 0xcc, 0x03, 0x1a, 0xb5, 0x2a, 0x0a, 0x79, 0x43, 0x23, 0xe7, 0x36, 0x0a, 0x7b, 0xe8, 0x14, + 0x12, 0x6e, 0x83, 0x26, 0x27, 0xf1, 0x30, 0x70, 0x89, 0x2a, 0xab, 0xaa, 0xca, 0x7a, 0xf5, 0xbc, + 0xb2, 0xba, 0x09, 0xcc, 0xb9, 0x3e, 0x3e, 0x5e, 0x6c, 0x76, 0x73, 0x1f, 0x54, 0x24, 0x80, 0x23, + 0x50, 0x7f, 0x94, 0x1c, 0x19, 0x6f, 0xcd, 0x2a, 0xb2, 0x7b, 0xd3, 0x8c, 0x93, 0xc9, 0x4e, 0xe0, + 0xce, 0x9c, 0x3c, 0xb0, 0x74, 0x85, 0xb2, 0x70, 0xf0, 0x23, 0x30, 0xcf, 0x62, 0xea, 0x12, 0xce, + 0x69, 0x2c, 0x4f, 0xbd, 0x55, 0x53, 0x2a, 0xbc, 0xa4, 0x55, 0x98, 0xdf, 0x29, 0x6e, 0xa2, 0xd3, + 0x58, 0xf8, 0xb3, 0x01, 0x16, 0xbc, 0x33, 0x43, 0xb8, 0x55, 0x57, 0x05, 0x7c, 0x31, 0x45, 0x01, + 0x67, 0xe7, 0xba, 0xd3, 0xd2, 0xd9, 0x4c, 0xbc, 0x10, 0x68, 0x22, 0xbc, 0xf9, 0x7b, 0x19, 0xcc, + 0x9f, 0x9a, 0x3e, 0xf0, 0x16, 0xa8, 0xb2, 0x1e, 0xe6, 0xe9, 0x35, 0x68, 0xa7, 0x37, 0x69, 0x47, + 0x1a, 0x9f, 0x1d, 0x2f, 0x36, 0xb6, 0xa9, 0x47, 0xd4, 0x02, 0x25, 0x40, 0x78, 0x1f, 0x34, 0xb8, + 0xc0, 0xb1, 0x20, 0xde, 0xa7, 0x42, 0x0f, 0xc3, 0xb7, 0xae, 0x36, 0x1e, 0x76, 0x83, 0x90, 0xe4, + 0x8d, 0xd9, 0x4d, 0x49, 0x50, 0xce, 0x07, 0xdf, 0x04, 0xb5, 0x90, 0x70, 0x8e, 0x7d, 0xa2, 0x3b, + 0xee, 0xba, 0x86, 0xd7, 0xb6, 0x12, 0x33, 0x4a, 0xf7, 0xe1, 0x77, 0xa0, 0x1a, 0x51, 0x8f, 0xf0, + 0x56, 0x55, 0xcd, 0x91, 0xee, 0x8b, 0x1a, 0xc8, 0x96, 0xac, 0x98, 0x6f, 0x44, 0x22, 0x2e, 0x0c, + 0x16, 0x65, 0x43, 0x49, 0xc0, 0xf6, 0x63, 0x00, 0x72, 0x0c, 0x5c, 0x00, 0xe5, 0x43, 0x32, 0x4a, + 0xf4, 0x43, 0xf2, 0x13, 0xde, 0x07, 0xd5, 0x21, 0xee, 0x0f, 0x88, 0x56, 0x67, 0x63, 0xaa, 0x76, + 0xf5, 0x88, 0x7e, 0x17, 0x12, 0xce, 0x0f, 0x4b, 0x6b, 0x86, 0xb9, 0x0c, 0xd4, 0x5b, 0x9b, 0x0d, + 0x28, 0xe3, 0xa2, 0x01, 0x65, 0xbe, 0x01, 0xd4, 0x93, 0x09, 0x5f, 0x03, 0xe5, 0x41, 0xdc, 0xd7, + 0xc0, 0xa6, 0x06, 0x96, 0xf7, 0xd0, 0x5d, 0x24, 0xed, 0xe6, 0x6f, 0xe5, 0xa4, 0x24, 0xdd, 0x14, + 0x6d, 0x50, 0x0a, 0x3c, 0x0d, 0x06, 0x1a, 0x5c, 0xda, 0x5c, 0x47, 0xa5, 0xc0, 0xcb, 0xc6, 0x66, + 0xf9, 0xc2, 0xb1, 0xf9, 0x1e, 0x68, 0xca, 0xc6, 0xeb, 0xe3, 0x91, 0x34, 0xaa, 0x01, 0xd0, 0x70, + 0xfe, 0xaf, 0x81, 0xcd, 0xf5, 0x7c, 0x0b, 0x15, 0x71, 0x79, 0x27, 0xce, 0x5e, 0xb5, 0x13, 0x1f, + 0x14, 0x3b, 0xb1, 0xa6, 0xb4, 0xb6, 0xaf, 0xd6, 0x89, 0x5b, 0x81, 0x1b, 0xd3, 0xff, 0xd6, 0x8e, + 0xf5, 0x4b, 0xda, 0xd1, 0x05, 0x60, 0xc0, 0x3c, 0x2c, 0x88, 0xa4, 0x6d, 0x35, 0x9e, 0x2f, 0x9b, + 0xec, 0x1f, 0x64, 0x2f, 0xa3, 0x42, 0x05, 0x5a, 0xf3, 0xd7, 0x12, 0xb8, 0x71, 0xde, 0x04, 0x83, + 0x3f, 0x18, 0xa0, 0xae, 0x9b, 0x87, 0xb7, 0x0c, 0x75, 0x21, 0xf6, 0xa6, 0xbf, 0x10, 0xe7, 0x84, + 0xca, 0x1f, 0x38, 0x8d, 0xe1, 0x28, 0x0b, 0x0c, 0x1f, 0x83, 0x1a, 0x27, 0x11, 0xa7, 0x71, 0xfa, + 0xb8, 0xef, 0x4e, 0x91, 0x43, 0x57, 0x31, 0x9d, 0x97, 0x42, 0x76, 0x08, 0x09, 0x84, 0xa3, 0x34, + 0xaa, 0xf9, 0x31, 0x78, 0xe5, 0x42, 0xb7, 0xcb, 0x1f, 0x7c, 0xc7, 0x3a, 0x3a, 0xe9, 0xcc, 0x3c, + 0x39, 0xe9, 0xcc, 0x3c, 0x3d, 0xe9, 0xcc, 0x7c, 0x3f, 0xee, 0x18, 0x47, 0xe3, 0x8e, 0xf1, 0x64, + 0xdc, 0x31, 0x9e, 0x8e, 0x3b, 0xc6, 0x5f, 0xe3, 0x8e, 0xf1, 0xd3, 0xdf, 0x9d, 0x99, 0xaf, 0xeb, + 0x69, 0x8a, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x6e, 0x73, 0x3d, 0xd7, 0x45, 0x0d, 0x00, 0x00, } diff --git a/pkg/apis/gateway/v1alpha1/generated.proto b/pkg/apis/gateway/v1alpha1/generated.proto index b422dfb450..acc686abc1 100644 --- a/pkg/apis/gateway/v1alpha1/generated.proto +++ b/pkg/apis/gateway/v1alpha1/generated.proto @@ -23,6 +23,7 @@ import "k8s.io/api/core/v1/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; +import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v1alpha1"; diff --git a/pkg/apis/sensor/v1alpha1/generated.pb.go b/pkg/apis/sensor/v1alpha1/generated.pb.go index a54e605220..49f4aafd84 100644 --- a/pkg/apis/sensor/v1alpha1/generated.pb.go +++ b/pkg/apis/sensor/v1alpha1/generated.pb.go @@ -46,7 +46,7 @@ const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package func (m *ArtifactLocation) Reset() { *m = ArtifactLocation{} } func (*ArtifactLocation) ProtoMessage() {} func (*ArtifactLocation) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{0} + return fileDescriptor_generated_558b4bfc5fa3d402, []int{0} } func (m *ArtifactLocation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -74,7 +74,7 @@ var xxx_messageInfo_ArtifactLocation proto.InternalMessageInfo func (m *ConfigmapArtifact) Reset() { *m = ConfigmapArtifact{} } func (*ConfigmapArtifact) ProtoMessage() {} func (*ConfigmapArtifact) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{1} + return fileDescriptor_generated_558b4bfc5fa3d402, []int{1} } func (m *ConfigmapArtifact) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -102,7 +102,7 @@ var xxx_messageInfo_ConfigmapArtifact proto.InternalMessageInfo func (m *Data) Reset() { *m = Data{} } func (*Data) ProtoMessage() {} func (*Data) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{2} + return fileDescriptor_generated_558b4bfc5fa3d402, []int{2} } func (m *Data) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -130,7 +130,7 @@ var xxx_messageInfo_Data proto.InternalMessageInfo func (m *DataFilter) Reset() { *m = DataFilter{} } func (*DataFilter) ProtoMessage() {} func (*DataFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{3} + return fileDescriptor_generated_558b4bfc5fa3d402, []int{3} } func (m *DataFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -158,7 +158,7 @@ var xxx_messageInfo_DataFilter proto.InternalMessageInfo func (m *EscalationPolicy) Reset() { *m = EscalationPolicy{} } func (*EscalationPolicy) ProtoMessage() {} func (*EscalationPolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{4} + return fileDescriptor_generated_558b4bfc5fa3d402, []int{4} } func (m *EscalationPolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -186,7 +186,7 @@ var xxx_messageInfo_EscalationPolicy proto.InternalMessageInfo func (m *Event) Reset() { *m = Event{} } func (*Event) ProtoMessage() {} func (*Event) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{5} + return fileDescriptor_generated_558b4bfc5fa3d402, []int{5} } func (m *Event) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -214,7 +214,7 @@ var xxx_messageInfo_Event proto.InternalMessageInfo func (m *EventContext) Reset() { *m = EventContext{} } func (*EventContext) ProtoMessage() {} func (*EventContext) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{6} + return fileDescriptor_generated_558b4bfc5fa3d402, []int{6} } func (m *EventContext) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -242,7 +242,7 @@ var xxx_messageInfo_EventContext proto.InternalMessageInfo func (m *EventDependency) Reset() { *m = EventDependency{} } func (*EventDependency) ProtoMessage() {} func (*EventDependency) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{7} + return fileDescriptor_generated_558b4bfc5fa3d402, []int{7} } func (m *EventDependency) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -270,7 +270,7 @@ var xxx_messageInfo_EventDependency proto.InternalMessageInfo func (m *EventDependencyFilter) Reset() { *m = EventDependencyFilter{} } func (*EventDependencyFilter) ProtoMessage() {} func (*EventDependencyFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{8} + return fileDescriptor_generated_558b4bfc5fa3d402, []int{8} } func (m *EventDependencyFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -298,7 +298,7 @@ var xxx_messageInfo_EventDependencyFilter proto.InternalMessageInfo func (m *EventProtocol) Reset() { *m = EventProtocol{} } func (*EventProtocol) ProtoMessage() {} func (*EventProtocol) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{9} + return fileDescriptor_generated_558b4bfc5fa3d402, []int{9} } func (m *EventProtocol) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -326,7 +326,7 @@ var xxx_messageInfo_EventProtocol proto.InternalMessageInfo func (m *FileArtifact) Reset() { *m = FileArtifact{} } func (*FileArtifact) ProtoMessage() {} func (*FileArtifact) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{10} + return fileDescriptor_generated_558b4bfc5fa3d402, []int{10} } func (m *FileArtifact) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -354,7 +354,7 @@ var xxx_messageInfo_FileArtifact proto.InternalMessageInfo func (m *GroupVersionKind) Reset() { *m = GroupVersionKind{} } func (*GroupVersionKind) ProtoMessage() {} func (*GroupVersionKind) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{11} + return fileDescriptor_generated_558b4bfc5fa3d402, []int{11} } func (m *GroupVersionKind) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -382,7 +382,7 @@ var xxx_messageInfo_GroupVersionKind proto.InternalMessageInfo func (m *Http) Reset() { *m = Http{} } func (*Http) ProtoMessage() {} func (*Http) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{12} + return fileDescriptor_generated_558b4bfc5fa3d402, []int{12} } func (m *Http) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -410,7 +410,7 @@ var xxx_messageInfo_Http proto.InternalMessageInfo func (m *Nats) Reset() { *m = Nats{} } func (*Nats) ProtoMessage() {} func (*Nats) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{13} + return fileDescriptor_generated_558b4bfc5fa3d402, []int{13} } func (m *Nats) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -438,7 +438,7 @@ var xxx_messageInfo_Nats proto.InternalMessageInfo func (m *NodeStatus) Reset() { *m = NodeStatus{} } func (*NodeStatus) ProtoMessage() {} func (*NodeStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{14} + return fileDescriptor_generated_558b4bfc5fa3d402, []int{14} } func (m *NodeStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -466,7 +466,7 @@ var xxx_messageInfo_NodeStatus proto.InternalMessageInfo func (m *ResourceObject) Reset() { *m = ResourceObject{} } func (*ResourceObject) ProtoMessage() {} func (*ResourceObject) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{15} + return fileDescriptor_generated_558b4bfc5fa3d402, []int{15} } func (m *ResourceObject) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -494,7 +494,7 @@ var xxx_messageInfo_ResourceObject proto.InternalMessageInfo func (m *ResourceParameter) Reset() { *m = ResourceParameter{} } func (*ResourceParameter) ProtoMessage() {} func (*ResourceParameter) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{16} + return fileDescriptor_generated_558b4bfc5fa3d402, []int{16} } func (m *ResourceParameter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -522,7 +522,7 @@ var xxx_messageInfo_ResourceParameter proto.InternalMessageInfo func (m *ResourceParameterSource) Reset() { *m = ResourceParameterSource{} } func (*ResourceParameterSource) ProtoMessage() {} func (*ResourceParameterSource) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{17} + return fileDescriptor_generated_558b4bfc5fa3d402, []int{17} } func (m *ResourceParameterSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -550,7 +550,7 @@ var xxx_messageInfo_ResourceParameterSource proto.InternalMessageInfo func (m *RetryStrategy) Reset() { *m = RetryStrategy{} } func (*RetryStrategy) ProtoMessage() {} func (*RetryStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{18} + return fileDescriptor_generated_558b4bfc5fa3d402, []int{18} } func (m *RetryStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -578,7 +578,7 @@ var xxx_messageInfo_RetryStrategy proto.InternalMessageInfo func (m *S3Artifact) Reset() { *m = S3Artifact{} } func (*S3Artifact) ProtoMessage() {} func (*S3Artifact) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{19} + return fileDescriptor_generated_558b4bfc5fa3d402, []int{19} } func (m *S3Artifact) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -606,7 +606,7 @@ var xxx_messageInfo_S3Artifact proto.InternalMessageInfo func (m *S3Bucket) Reset() { *m = S3Bucket{} } func (*S3Bucket) ProtoMessage() {} func (*S3Bucket) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{20} + return fileDescriptor_generated_558b4bfc5fa3d402, []int{20} } func (m *S3Bucket) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -634,7 +634,7 @@ var xxx_messageInfo_S3Bucket proto.InternalMessageInfo func (m *S3Filter) Reset() { *m = S3Filter{} } func (*S3Filter) ProtoMessage() {} func (*S3Filter) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{21} + return fileDescriptor_generated_558b4bfc5fa3d402, []int{21} } func (m *S3Filter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -662,7 +662,7 @@ var xxx_messageInfo_S3Filter proto.InternalMessageInfo func (m *Sensor) Reset() { *m = Sensor{} } func (*Sensor) ProtoMessage() {} func (*Sensor) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{22} + return fileDescriptor_generated_558b4bfc5fa3d402, []int{22} } func (m *Sensor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -690,7 +690,7 @@ var xxx_messageInfo_Sensor proto.InternalMessageInfo func (m *SensorList) Reset() { *m = SensorList{} } func (*SensorList) ProtoMessage() {} func (*SensorList) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{23} + return fileDescriptor_generated_558b4bfc5fa3d402, []int{23} } func (m *SensorList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -718,7 +718,7 @@ var xxx_messageInfo_SensorList proto.InternalMessageInfo func (m *SensorSpec) Reset() { *m = SensorSpec{} } func (*SensorSpec) ProtoMessage() {} func (*SensorSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{24} + return fileDescriptor_generated_558b4bfc5fa3d402, []int{24} } func (m *SensorSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -746,7 +746,7 @@ var xxx_messageInfo_SensorSpec proto.InternalMessageInfo func (m *SensorStatus) Reset() { *m = SensorStatus{} } func (*SensorStatus) ProtoMessage() {} func (*SensorStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{25} + return fileDescriptor_generated_558b4bfc5fa3d402, []int{25} } func (m *SensorStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -774,7 +774,7 @@ var xxx_messageInfo_SensorStatus proto.InternalMessageInfo func (m *TimeFilter) Reset() { *m = TimeFilter{} } func (*TimeFilter) ProtoMessage() {} func (*TimeFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{26} + return fileDescriptor_generated_558b4bfc5fa3d402, []int{26} } func (m *TimeFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -802,7 +802,7 @@ var xxx_messageInfo_TimeFilter proto.InternalMessageInfo func (m *Trigger) Reset() { *m = Trigger{} } func (*Trigger) ProtoMessage() {} func (*Trigger) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{27} + return fileDescriptor_generated_558b4bfc5fa3d402, []int{27} } func (m *Trigger) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -830,7 +830,7 @@ var xxx_messageInfo_Trigger proto.InternalMessageInfo func (m *URI) Reset() { *m = URI{} } func (*URI) ProtoMessage() {} func (*URI) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{28} + return fileDescriptor_generated_558b4bfc5fa3d402, []int{28} } func (m *URI) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -858,7 +858,7 @@ var xxx_messageInfo_URI proto.InternalMessageInfo func (m *URLArtifact) Reset() { *m = URLArtifact{} } func (*URLArtifact) ProtoMessage() {} func (*URLArtifact) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_7f43a4b5cc4e77b1, []int{29} + return fileDescriptor_generated_558b4bfc5fa3d402, []int{29} } func (m *URLArtifact) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1282,6 +1282,14 @@ func (m *EventDependency) MarshalTo(dAtA []byte) (int, error) { return 0, err } i += n12 + dAtA[i] = 0x20 + i++ + if m.Connected { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ return i, nil } @@ -2423,6 +2431,7 @@ func (m *EventDependency) Size() (n int) { n += 1 + sovGenerated(uint64(m.Deadline)) l = m.Filters.Size() n += 1 + l + sovGenerated(uint64(l)) + n += 2 return n } @@ -2969,6 +2978,7 @@ func (this *EventDependency) String() string { `Name:` + fmt.Sprintf("%v", this.Name) + `,`, `Deadline:` + fmt.Sprintf("%v", this.Deadline) + `,`, `Filters:` + strings.Replace(strings.Replace(this.Filters.String(), "EventDependencyFilter", "EventDependencyFilter", 1), `&`, ``, 1) + `,`, + `Connected:` + fmt.Sprintf("%v", this.Connected) + `,`, `}`, }, "") return s @@ -4714,6 +4724,26 @@ func (m *EventDependency) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Connected", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Connected = bool(v != 0) default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -8601,176 +8631,177 @@ var ( ) func init() { - proto.RegisterFile("github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1/generated.proto", fileDescriptor_generated_7f43a4b5cc4e77b1) -} - -var fileDescriptor_generated_7f43a4b5cc4e77b1 = []byte{ - // 2670 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0x4d, 0x6f, 0x23, 0xc7, - 0xd1, 0xde, 0xe1, 0x97, 0xc8, 0x92, 0xd6, 0xd2, 0xb6, 0x6d, 0x98, 0xaf, 0x0c, 0x8b, 0xfb, 0x8e, - 0x11, 0xc3, 0x09, 0x6c, 0xd2, 0xde, 0x8d, 0x0d, 0x27, 0x80, 0x13, 0x8b, 0xa2, 0xd6, 0x96, 0xa5, - 0x95, 0xe5, 0xa6, 0x77, 0x03, 0x38, 0x06, 0xb2, 0xad, 0x99, 0x26, 0x35, 0xd6, 0x70, 0x66, 0x3c, - 0xdd, 0x64, 0x96, 0x41, 0x90, 0x38, 0x46, 0x12, 0x04, 0x46, 0x0e, 0xbe, 0xe5, 0x90, 0x63, 0xfe, - 0x43, 0xae, 0x41, 0x82, 0x1c, 0x7c, 0x09, 0xe0, 0x5c, 0x02, 0xe7, 0x10, 0x22, 0x66, 0x80, 0x1c, - 0xf2, 0x13, 0xf6, 0x14, 0xf4, 0xc7, 0xf4, 0x0c, 0x87, 0x54, 0xac, 0x15, 0x05, 0xf8, 0xb2, 0x3b, - 0x53, 0x55, 0x5d, 0x55, 0x53, 0xdd, 0x5d, 0xf5, 0x54, 0x51, 0xf0, 0x46, 0xdf, 0xe3, 0x27, 0xc3, - 0xe3, 0xa6, 0x13, 0x0e, 0x5a, 0x24, 0xee, 0x87, 0x51, 0x1c, 0xbe, 0x2f, 0x1f, 0x9e, 0xa7, 0x23, - 0x1a, 0x70, 0xd6, 0x8a, 0x4e, 0xfb, 0x2d, 0x12, 0x79, 0xac, 0xc5, 0x68, 0xc0, 0xc2, 0xb8, 0x35, - 0x7a, 0x91, 0xf8, 0xd1, 0x09, 0x79, 0xb1, 0xd5, 0xa7, 0x01, 0x8d, 0x09, 0xa7, 0x6e, 0x33, 0x8a, - 0x43, 0x1e, 0xa2, 0x57, 0x52, 0x4d, 0xcd, 0x44, 0x93, 0x7c, 0xf8, 0x81, 0xd2, 0xd4, 0x8c, 0x4e, - 0xfb, 0x4d, 0xa1, 0xa9, 0xa9, 0x34, 0x35, 0x13, 0x4d, 0x9b, 0xcf, 0x67, 0x7c, 0xe8, 0x87, 0xfd, - 0xb0, 0x25, 0x15, 0x1e, 0x0f, 0x7b, 0xf2, 0x4d, 0xbe, 0xc8, 0x27, 0x65, 0x68, 0xd3, 0x3e, 0x7d, - 0x85, 0x35, 0xbd, 0x50, 0x78, 0xd5, 0x72, 0xc2, 0x98, 0xb6, 0x46, 0x73, 0xce, 0x6c, 0x7e, 0x33, - 0x95, 0x19, 0x10, 0xe7, 0xc4, 0x0b, 0x68, 0x3c, 0x4e, 0x3f, 0x65, 0x40, 0x39, 0x59, 0xb4, 0xaa, - 0x75, 0xd6, 0xaa, 0x78, 0x18, 0x70, 0x6f, 0x40, 0xe7, 0x16, 0xbc, 0xfc, 0x65, 0x0b, 0x98, 0x73, - 0x42, 0x07, 0x24, 0xbf, 0xce, 0xfe, 0x5b, 0x11, 0x36, 0xb6, 0x63, 0xee, 0xf5, 0x88, 0xc3, 0x0f, - 0x42, 0x87, 0x70, 0x2f, 0x0c, 0xd0, 0x7b, 0x50, 0x60, 0x37, 0xeb, 0xd6, 0x75, 0xeb, 0xd9, 0xd5, - 0x1b, 0x9d, 0xe6, 0x45, 0xa3, 0xd9, 0xec, 0xde, 0x4c, 0x34, 0xb7, 0x2b, 0xd3, 0x49, 0xa3, 0xd0, - 0xbd, 0x89, 0x0b, 0xec, 0x26, 0xb2, 0xa1, 0xe2, 0x05, 0xbe, 0x17, 0xd0, 0x7a, 0xe1, 0xba, 0xf5, - 0x6c, 0xad, 0x0d, 0xd3, 0x49, 0xa3, 0xb2, 0x27, 0x29, 0x58, 0x73, 0x90, 0x0b, 0xa5, 0x9e, 0xe7, - 0xd3, 0x7a, 0x51, 0xfa, 0x70, 0xeb, 0xe2, 0x3e, 0xdc, 0xf2, 0x7c, 0x6a, 0xbc, 0xa8, 0x4e, 0x27, - 0x8d, 0x92, 0xa0, 0x60, 0xa9, 0x1d, 0xdd, 0x83, 0xe2, 0x30, 0xf6, 0xeb, 0x25, 0x69, 0x64, 0xf7, - 0xe2, 0x46, 0xee, 0xe0, 0x03, 0x63, 0x63, 0x65, 0x3a, 0x69, 0x14, 0xef, 0xe0, 0x03, 0x2c, 0x54, - 0xa3, 0xfb, 0x50, 0x73, 0xc2, 0xa0, 0xe7, 0xf5, 0x07, 0x24, 0xaa, 0x97, 0xa5, 0x9d, 0xfd, 0x8b, - 0xdb, 0xd9, 0x49, 0x54, 0x19, 0x6b, 0x57, 0xa7, 0x93, 0x46, 0xcd, 0x90, 0x71, 0x6a, 0xcc, 0xfe, - 0x85, 0x05, 0xd7, 0xe6, 0xe4, 0xd1, 0x75, 0x28, 0x05, 0x64, 0x40, 0xe5, 0xde, 0xd6, 0xda, 0x6b, - 0x9f, 0x4e, 0x1a, 0x57, 0x44, 0x4c, 0x0e, 0xc9, 0x80, 0x62, 0xc9, 0x41, 0x2d, 0xa8, 0x89, 0xff, - 0x59, 0x44, 0x9c, 0x64, 0x83, 0xae, 0x69, 0xb1, 0xda, 0x61, 0xc2, 0xc0, 0xa9, 0x0c, 0x7a, 0x0a, - 0x8a, 0xa7, 0x74, 0x2c, 0x77, 0xaa, 0xd6, 0x5e, 0xd5, 0xa2, 0xc5, 0x7d, 0x3a, 0xc6, 0x82, 0x6e, - 0x7f, 0x54, 0x80, 0x52, 0x87, 0x70, 0x82, 0x4e, 0x61, 0xa5, 0xe7, 0xf9, 0x9c, 0xc6, 0xac, 0x6e, - 0x5d, 0x2f, 0x2e, 0x77, 0xb2, 0x84, 0xc2, 0x5b, 0x52, 0x59, 0x7b, 0x75, 0x3a, 0x69, 0xac, 0xa8, - 0x67, 0x86, 0x13, 0x0b, 0xe8, 0xd7, 0x16, 0x6c, 0x50, 0xe6, 0x10, 0x5f, 0x1e, 0xe8, 0xa3, 0xd0, - 0xf7, 0x9c, 0xb1, 0xfc, 0x9a, 0xd5, 0x1b, 0x6f, 0x5e, 0xdc, 0xec, 0x6e, 0x4e, 0x63, 0xfb, 0xb1, - 0xe9, 0xa4, 0xb1, 0x91, 0xa7, 0xe2, 0x39, 0xcb, 0xf6, 0x27, 0x05, 0x80, 0xd4, 0x67, 0xb1, 0x0b, - 0x11, 0xe1, 0x27, 0xf9, 0x5d, 0x38, 0x22, 0xfc, 0x04, 0x4b, 0x0e, 0x7a, 0x0e, 0x4a, 0x7c, 0x1c, - 0x25, 0x1b, 0x50, 0x4f, 0x24, 0xde, 0x19, 0x47, 0xf4, 0xc1, 0xa4, 0x51, 0x7d, 0xb3, 0xfb, 0xd6, - 0xa1, 0x78, 0xc6, 0x52, 0x0a, 0x3d, 0x0d, 0xe5, 0x11, 0xf1, 0x87, 0x54, 0x6f, 0xc2, 0x55, 0x2d, - 0x5e, 0xbe, 0x2b, 0x88, 0x58, 0xf1, 0x16, 0x87, 0xa4, 0xf4, 0x95, 0x85, 0xe4, 0x37, 0x16, 0xcc, - 0x89, 0x9d, 0xe3, 0x78, 0xbe, 0x0c, 0x65, 0x9f, 0x8e, 0xa8, 0xaf, 0x23, 0x73, 0x3d, 0xf9, 0xd4, - 0x03, 0x41, 0x7c, 0x30, 0x69, 0xac, 0xa7, 0x3a, 0x25, 0x09, 0x2b, 0x71, 0xf4, 0x75, 0x58, 0x19, - 0x50, 0xc6, 0x48, 0x3f, 0x09, 0xd2, 0xba, 0x5e, 0xb9, 0x72, 0x5b, 0x91, 0x71, 0xc2, 0xb7, 0x7f, - 0x6b, 0x41, 0x79, 0x57, 0x7c, 0x36, 0xfa, 0x00, 0x56, 0x9c, 0x30, 0xe0, 0xf4, 0x3e, 0xd7, 0xc9, - 0x70, 0x89, 0x44, 0x24, 0x35, 0xee, 0x28, 0x6d, 0xa9, 0x71, 0x4d, 0xc0, 0x89, 0x1d, 0xd4, 0x80, - 0x92, 0x4b, 0x38, 0x91, 0x9f, 0xb7, 0xa6, 0x0e, 0xf7, 0x11, 0x19, 0xfb, 0x21, 0x71, 0xb1, 0x64, - 0xd8, 0x7f, 0x58, 0x81, 0xb5, 0xac, 0x2e, 0x71, 0x61, 0xa5, 0x6d, 0x71, 0x1e, 0x74, 0xe0, 0xcc, - 0x85, 0xdd, 0x4d, 0x18, 0x38, 0x95, 0x41, 0x1d, 0xd8, 0x30, 0x2f, 0x77, 0x69, 0xcc, 0xbc, 0x30, - 0xc8, 0x9d, 0xb3, 0x8d, 0xdd, 0x1c, 0x1f, 0xcf, 0xad, 0x40, 0x6f, 0x02, 0x72, 0xfc, 0x70, 0xe8, - 0x4a, 0x51, 0x96, 0xe8, 0x51, 0xb1, 0xdd, 0xd4, 0x7a, 0xd0, 0xce, 0x9c, 0x04, 0x5e, 0xb0, 0x0a, - 0x11, 0xa8, 0xb0, 0x70, 0x18, 0x3b, 0x54, 0x9f, 0xc7, 0x57, 0x97, 0x49, 0xc5, 0x7b, 0xaa, 0xa0, - 0x74, 0xa5, 0x42, 0xac, 0x15, 0x8b, 0xfd, 0x97, 0x4b, 0xf7, 0x3a, 0x32, 0x0d, 0x67, 0xf6, 0x7f, - 0x57, 0x91, 0x71, 0xc2, 0x47, 0xf7, 0x92, 0x80, 0x7a, 0x03, 0x5a, 0xaf, 0x48, 0x87, 0x5a, 0x4d, - 0x55, 0x5e, 0x9b, 0xd9, 0xf2, 0x9a, 0x3a, 0x21, 0xaa, 0x78, 0x73, 0xf4, 0x62, 0xf3, 0xb6, 0xe7, - 0xc4, 0xa1, 0x58, 0x96, 0xdf, 0x01, 0x6f, 0x60, 0x76, 0xc0, 0x1b, 0x50, 0xf4, 0x3e, 0xd4, 0x54, - 0x39, 0xbe, 0x83, 0x0f, 0xea, 0x2b, 0x97, 0xf1, 0xc9, 0xb2, 0x0e, 0x74, 0x13, 0x9d, 0x38, 0x55, - 0x8f, 0x5e, 0x82, 0x55, 0x79, 0xb6, 0xf4, 0x01, 0xa9, 0xca, 0x8f, 0x7f, 0x54, 0xbb, 0xb7, 0xba, - 0x93, 0xb2, 0x70, 0x56, 0x0e, 0x7d, 0x6c, 0x01, 0xd0, 0xfb, 0x9c, 0x06, 0x62, 0x83, 0x58, 0xbd, - 0x26, 0x33, 0xf6, 0xdd, 0xcb, 0x39, 0xfe, 0xcd, 0x5d, 0xa3, 0x78, 0x37, 0xe0, 0xf1, 0xb8, 0x8d, - 0xb4, 0x3b, 0x90, 0x32, 0x70, 0xc6, 0xfa, 0xe2, 0xd4, 0x05, 0x5f, 0x55, 0xea, 0xda, 0x7c, 0x15, - 0xd6, 0x73, 0x5f, 0x80, 0x36, 0x54, 0x11, 0x94, 0xd7, 0x4f, 0xd6, 0x3d, 0xf4, 0x58, 0x92, 0x93, - 0xe5, 0xd5, 0xd2, 0x49, 0xf8, 0xdb, 0x85, 0x57, 0x2c, 0xfb, 0x1f, 0x16, 0xac, 0xcb, 0x70, 0x74, - 0x68, 0x44, 0x03, 0x97, 0x06, 0xe7, 0x4a, 0x7c, 0xcf, 0x41, 0xd5, 0xa5, 0xc4, 0x35, 0xb8, 0xa9, - 0xd8, 0xde, 0xd0, 0x52, 0xd5, 0x8e, 0xa6, 0x63, 0x23, 0x81, 0x7e, 0x94, 0x16, 0x5b, 0x05, 0xa1, - 0xde, 0x5a, 0x72, 0xeb, 0x52, 0x5f, 0x75, 0xdd, 0x35, 0xf7, 0x27, 0x5f, 0x7b, 0xed, 0xff, 0x14, - 0xe0, 0xf1, 0x85, 0x6b, 0xce, 0xf1, 0x95, 0xc7, 0x50, 0x12, 0x68, 0x55, 0x97, 0xea, 0x25, 0x10, - 0x82, 0xb8, 0x67, 0xda, 0x53, 0x89, 0xfa, 0xe4, 0x15, 0x94, 0xba, 0xd1, 0x20, 0xcd, 0xea, 0xc5, - 0x4b, 0xcd, 0xea, 0xab, 0x0b, 0x33, 0xfa, 0x7b, 0x3a, 0xa3, 0xab, 0xd4, 0xf6, 0x9d, 0xe5, 0x40, - 0x8f, 0xfa, 0x18, 0xf1, 0xa4, 0xcb, 0xc1, 0xc7, 0x05, 0xb8, 0x2a, 0x9d, 0x38, 0x12, 0x70, 0xde, - 0x09, 0x7d, 0xf4, 0x92, 0x86, 0x0e, 0x2a, 0xc8, 0xff, 0x9f, 0x83, 0x0e, 0xd7, 0x66, 0x84, 0x33, - 0x18, 0xe2, 0x1e, 0x94, 0x4e, 0x38, 0x8f, 0x74, 0xe4, 0x97, 0x70, 0xf3, 0x0d, 0xce, 0xa3, 0x74, - 0x6f, 0xc5, 0x1b, 0x96, 0x9a, 0x85, 0x85, 0x80, 0xf0, 0xe4, 0x40, 0x2e, 0x61, 0xe1, 0x90, 0x70, - 0x96, 0x3d, 0x3d, 0x9c, 0x61, 0xa9, 0xd9, 0x7e, 0x01, 0xd6, 0xb2, 0x78, 0xff, 0xcb, 0x71, 0x96, - 0xfd, 0x73, 0x0b, 0x36, 0x5e, 0x8f, 0xc3, 0x61, 0xa4, 0x4b, 0xd1, 0xbe, 0x17, 0xb8, 0x02, 0x4e, - 0xf5, 0x05, 0x4d, 0xaf, 0x33, 0x70, 0x4a, 0x0a, 0x62, 0xc5, 0x13, 0x05, 0x65, 0x34, 0x53, 0x3c, - 0xcd, 0x85, 0x48, 0x2a, 0x5d, 0xc2, 0x17, 0x6e, 0x9c, 0x7a, 0x81, 0xab, 0x8b, 0xa3, 0x71, 0x43, - 0xd8, 0xc2, 0x92, 0x63, 0x3f, 0x0b, 0x32, 0x50, 0xd2, 0xe1, 0x30, 0xe6, 0x73, 0x0e, 0x87, 0x31, - 0xc7, 0x92, 0x63, 0xff, 0xb1, 0x04, 0xf2, 0x8b, 0x05, 0xec, 0x16, 0xbd, 0x8b, 0x35, 0x0b, 0xbb, - 0x4d, 0xe3, 0xd1, 0x85, 0xc7, 0x19, 0x27, 0x31, 0xff, 0x9e, 0xc7, 0x4f, 0x0e, 0x08, 0xe3, 0x98, - 0x3a, 0xd4, 0x1b, 0x51, 0x57, 0x3a, 0x5b, 0x6d, 0x3f, 0xa5, 0x17, 0x3c, 0xde, 0x5d, 0x24, 0x84, - 0x17, 0xaf, 0x45, 0xb7, 0xe1, 0x51, 0x97, 0xfa, 0xde, 0x88, 0xc6, 0xdb, 0xbe, 0xbf, 0x3d, 0x22, - 0x9e, 0x4f, 0x8e, 0x75, 0x93, 0x56, 0x6d, 0x3f, 0xa9, 0x55, 0x3e, 0xda, 0x99, 0x17, 0xc1, 0x8b, - 0xd6, 0xa1, 0x6d, 0x58, 0x97, 0x76, 0xb6, 0x79, 0x97, 0x7e, 0x30, 0xa4, 0x81, 0xae, 0xff, 0xb5, - 0xf6, 0x13, 0x5a, 0xd5, 0x7a, 0x77, 0x96, 0x8d, 0xf3, 0xf2, 0xa2, 0xba, 0x69, 0x92, 0xac, 0xd6, - 0xe5, 0xd9, 0xea, 0xd6, 0x4d, 0x59, 0x38, 0x2b, 0x27, 0x20, 0x50, 0xe6, 0xb5, 0x43, 0x7d, 0x4e, - 0x64, 0xa5, 0xcf, 0x40, 0xa0, 0x6e, 0x8e, 0x8f, 0xe7, 0x56, 0x88, 0x23, 0xe0, 0x0e, 0x63, 0x19, - 0x82, 0x15, 0x19, 0x02, 0x73, 0x04, 0x3a, 0x8a, 0x8c, 0x13, 0xbe, 0x00, 0x69, 0x8e, 0x3f, 0x64, - 0x9c, 0xc6, 0x7b, 0xae, 0xae, 0xc1, 0x06, 0x22, 0xec, 0x24, 0x0c, 0x9c, 0xca, 0x88, 0x74, 0xef, - 0xf8, 0x9e, 0x00, 0x24, 0x6e, 0xbd, 0x26, 0xe5, 0x4d, 0xba, 0xdf, 0xd1, 0x74, 0x6c, 0x24, 0x4c, - 0xbb, 0x00, 0x8b, 0xdb, 0x05, 0x71, 0x60, 0xd2, 0xab, 0x6e, 0xff, 0xb9, 0x04, 0x70, 0x18, 0xba, - 0xb4, 0xcb, 0x09, 0x1f, 0x32, 0xb4, 0x09, 0x05, 0xcf, 0xd5, 0x07, 0x09, 0xf4, 0xd2, 0xc2, 0x5e, - 0x07, 0x17, 0x3c, 0xd7, 0x64, 0xec, 0xc2, 0x99, 0x19, 0xfb, 0x25, 0x58, 0x75, 0x3d, 0x16, 0xf9, - 0x64, 0x2c, 0x88, 0xfa, 0x8c, 0x9b, 0x1d, 0xe8, 0xa4, 0x2c, 0x9c, 0x95, 0x33, 0x1e, 0x97, 0xce, - 0xf0, 0x38, 0x74, 0x69, 0x26, 0x39, 0xbd, 0x00, 0xe5, 0xe8, 0x84, 0xb0, 0x64, 0x83, 0x13, 0x7c, - 0x59, 0x3e, 0x12, 0xc4, 0x07, 0xa2, 0x33, 0x0d, 0x5d, 0x2a, 0x5f, 0xb0, 0x12, 0x14, 0x20, 0x4e, - 0xee, 0x17, 0x75, 0xb7, 0xf9, 0xd2, 0x20, 0xae, 0x9b, 0x68, 0xc2, 0xa9, 0x52, 0xd4, 0x13, 0xc0, - 0x6a, 0x10, 0xf9, 0x54, 0xd9, 0x58, 0xb9, 0x98, 0x8d, 0x0c, 0x12, 0x33, 0xba, 0x70, 0x56, 0x71, - 0xb6, 0x73, 0xa9, 0xfe, 0xef, 0xce, 0x05, 0xf9, 0xb0, 0xea, 0x13, 0x4e, 0x19, 0x97, 0x49, 0x5e, - 0x9e, 0x9b, 0xd5, 0x1b, 0xdf, 0x5d, 0xb2, 0xba, 0xb5, 0x6b, 0x22, 0xd2, 0xf2, 0x11, 0x67, 0xd5, - 0xdb, 0x1f, 0x95, 0xe1, 0x11, 0x4c, 0x15, 0xbe, 0x7e, 0xeb, 0xf8, 0x7d, 0xea, 0xf0, 0xd9, 0xe1, - 0x81, 0x75, 0x8e, 0xe1, 0xc1, 0x8f, 0xa1, 0xe2, 0x93, 0x63, 0xea, 0x8b, 0xaa, 0x20, 0x10, 0xe6, - 0x3b, 0x17, 0x77, 0x76, 0xd6, 0x95, 0xe6, 0x81, 0x54, 0xab, 0xf0, 0xe5, 0x23, 0xda, 0x87, 0x8a, - 0x22, 0x62, 0x6d, 0x13, 0xfd, 0x14, 0x20, 0x22, 0x31, 0x19, 0x50, 0x09, 0x94, 0x4a, 0xd2, 0x83, - 0xfd, 0xe5, 0x3d, 0x38, 0x4a, 0x74, 0xa6, 0xc0, 0xd6, 0x90, 0x18, 0xce, 0x98, 0x44, 0x9f, 0x58, - 0xb0, 0xd1, 0xcf, 0x95, 0x1f, 0x3d, 0x26, 0x5a, 0x02, 0xd8, 0xe6, 0x0b, 0x5a, 0x9a, 0xd4, 0xf2, - 0x1c, 0x3c, 0x67, 0x1d, 0xc5, 0xa6, 0x17, 0xab, 0x2c, 0xeb, 0x47, 0x7e, 0xae, 0x98, 0xee, 0xc3, - 0x6c, 0x73, 0xb6, 0xf9, 0x2d, 0x58, 0xcd, 0x6c, 0xd7, 0x43, 0x81, 0xe9, 0xdf, 0x59, 0x70, 0x6d, - 0x2e, 0xee, 0xc8, 0x87, 0x22, 0x8b, 0x1d, 0xdd, 0xb4, 0xbf, 0x7d, 0x89, 0x3b, 0xaa, 0x1c, 0x57, - 0x43, 0xbe, 0x6e, 0xec, 0x60, 0x61, 0x46, 0x24, 0x49, 0x97, 0x32, 0x9e, 0x4f, 0x92, 0x1d, 0xca, - 0x38, 0x96, 0x1c, 0xfb, 0x67, 0x16, 0x3c, 0x71, 0x86, 0x2e, 0x81, 0x36, 0xa4, 0x1b, 0x79, 0xb4, - 0xa1, 0x6e, 0x9c, 0xe2, 0x19, 0x24, 0x53, 0x38, 0x73, 0x62, 0xd4, 0x98, 0x9d, 0x01, 0xd5, 0xf2, - 0xf3, 0x1f, 0x7b, 0x1d, 0xae, 0x62, 0xca, 0xe3, 0x71, 0x97, 0xc7, 0x84, 0xd3, 0xfe, 0xd8, 0xfe, - 0x7b, 0x01, 0x20, 0x1d, 0xd1, 0x26, 0x73, 0x3c, 0x6b, 0xf1, 0x1c, 0x0f, 0xdd, 0x4d, 0xdc, 0x54, - 0x2e, 0xbc, 0x36, 0xe3, 0xe6, 0x83, 0x49, 0xa3, 0x95, 0x19, 0x9d, 0x0f, 0xbc, 0xc0, 0x0b, 0xd5, - 0xbf, 0xcf, 0xf7, 0xc3, 0xe6, 0x61, 0xc8, 0xbd, 0x9e, 0xa7, 0xce, 0x40, 0x3a, 0x91, 0xd0, 0x5f, - 0xd6, 0x83, 0x8a, 0x6a, 0x1c, 0x34, 0x2e, 0x6c, 0x2f, 0x33, 0x6f, 0xd6, 0x88, 0x5f, 0x0e, 0x00, - 0xd4, 0x33, 0xd6, 0xda, 0x91, 0x0f, 0x55, 0x76, 0xb3, 0x3d, 0x74, 0x4e, 0x29, 0xd7, 0x50, 0x7c, - 0x29, 0x4b, 0x4a, 0x53, 0x7b, 0x4d, 0x14, 0xe4, 0xe4, 0x0d, 0x1b, 0x0b, 0xf6, 0xa4, 0x00, 0x86, - 0x2c, 0x6a, 0x39, 0x0d, 0xdc, 0x28, 0xf4, 0xcc, 0x26, 0x9b, 0x5a, 0xbe, 0xab, 0xe9, 0xd8, 0x48, - 0xa0, 0x67, 0xa0, 0x72, 0xac, 0xdc, 0x54, 0x91, 0x36, 0x97, 0x46, 0x1b, 0xd1, 0x5c, 0x21, 0x17, - 0xd3, 0x7e, 0x3a, 0x74, 0x31, 0x72, 0x58, 0x52, 0xb1, 0xe6, 0x0a, 0xeb, 0x5e, 0xc0, 0xa8, 0x33, - 0x8c, 0x55, 0xb5, 0xad, 0xa6, 0xd6, 0xf7, 0x34, 0x1d, 0x1b, 0x09, 0x84, 0xa1, 0x46, 0x1c, 0x87, - 0x32, 0xb6, 0x4f, 0xc7, 0x3a, 0x13, 0x7d, 0x2d, 0x53, 0xd3, 0x9a, 0x4e, 0x18, 0x53, 0x51, 0xc1, - 0xba, 0xd4, 0x89, 0x29, 0xdf, 0xa7, 0xe3, 0x2e, 0xf5, 0xa9, 0xc3, 0xc3, 0x58, 0x8d, 0x20, 0xb6, - 0x93, 0xb5, 0x38, 0x55, 0x23, 0x74, 0xb2, 0x44, 0x5c, 0x67, 0x95, 0x87, 0xd1, 0x69, 0xc8, 0x38, - 0x55, 0x63, 0xbf, 0x2b, 0xe2, 0xab, 0xdb, 0xca, 0x67, 0xa0, 0x12, 0xc5, 0xb4, 0xe7, 0xdd, 0xd7, - 0xd1, 0x35, 0x91, 0x38, 0x92, 0x54, 0xac, 0xb9, 0x42, 0x8e, 0x0d, 0x7b, 0x42, 0x2e, 0x17, 0xd9, - 0xae, 0xa4, 0x62, 0xcd, 0xb5, 0xff, 0x54, 0x80, 0x4a, 0x57, 0xee, 0x38, 0xba, 0x07, 0x55, 0x51, - 0xb3, 0x65, 0x03, 0xa7, 0xb2, 0xc9, 0x0b, 0xe7, 0xab, 0xf0, 0xaa, 0x0a, 0xdd, 0xa6, 0x9c, 0xa4, - 0x45, 0x20, 0xa5, 0x61, 0xa3, 0x15, 0xf5, 0xa0, 0xc4, 0x22, 0xea, 0x2c, 0xdf, 0xf1, 0x2a, 0x8f, - 0xbb, 0x11, 0x75, 0xd2, 0xfc, 0x20, 0xde, 0xb0, 0xd4, 0x8f, 0x02, 0xa8, 0x30, 0x89, 0xf7, 0x96, - 0x6f, 0x7a, 0xb5, 0x25, 0xa9, 0x2d, 0x13, 0x44, 0xf9, 0x8e, 0xb5, 0x15, 0xfb, 0xaf, 0x16, 0x80, - 0x12, 0x3c, 0xf0, 0x98, 0xe8, 0x82, 0xf3, 0x81, 0x6c, 0x9e, 0x2f, 0x90, 0x62, 0xb5, 0x0c, 0xa3, - 0x39, 0xb5, 0x09, 0x25, 0x13, 0x44, 0x0a, 0x65, 0x8f, 0xd3, 0x01, 0xab, 0x17, 0x64, 0x0d, 0x7f, - 0x6d, 0xd9, 0x6f, 0x4b, 0xb3, 0xf0, 0x9e, 0x50, 0x8b, 0x95, 0x76, 0x7b, 0x52, 0x4c, 0xbe, 0x49, - 0x04, 0x16, 0xfd, 0xca, 0x82, 0x35, 0x37, 0x99, 0x71, 0x78, 0x34, 0xf9, 0x5d, 0x63, 0xef, 0xd2, - 0x46, 0x2d, 0xed, 0xff, 0xd3, 0x6e, 0x5c, 0x9b, 0x65, 0x78, 0x94, 0xe1, 0x19, 0xcb, 0x28, 0x84, - 0x2a, 0x8f, 0xbd, 0x7e, 0x5f, 0xe0, 0x18, 0x15, 0x83, 0xed, 0x25, 0x66, 0x27, 0x4a, 0x53, 0x1a, - 0x71, 0x4d, 0x60, 0xd8, 0x18, 0x41, 0xfb, 0x00, 0x2e, 0x8d, 0xfc, 0x70, 0x2c, 0x22, 0xa1, 0x8f, - 0xd4, 0x93, 0x8b, 0x2e, 0xf5, 0x51, 0xe8, 0xca, 0x33, 0xf9, 0x88, 0xb8, 0x01, 0x1d, 0xb3, 0x04, - 0x67, 0x96, 0xa3, 0x5f, 0x5a, 0xb0, 0x21, 0x9a, 0x03, 0xc2, 0x9d, 0x93, 0x64, 0x34, 0xa1, 0x93, - 0xf4, 0xeb, 0x4b, 0x06, 0x33, 0x51, 0xd7, 0xbe, 0x36, 0x9d, 0x34, 0x66, 0x27, 0x25, 0x78, 0xce, - 0xa6, 0xfd, 0xef, 0x12, 0xac, 0x65, 0x4f, 0x77, 0xda, 0x78, 0x58, 0xe7, 0x6d, 0x3c, 0xbe, 0x9f, - 0x6d, 0x3c, 0xd4, 0xa5, 0xfe, 0xc6, 0xf9, 0x4e, 0xfa, 0x39, 0x7a, 0x0e, 0x32, 0xdb, 0x73, 0x14, - 0x1f, 0x5a, 0xfd, 0x43, 0xb5, 0x1b, 0xa5, 0x2f, 0x69, 0x37, 0x46, 0x50, 0x0e, 0x42, 0x97, 0xb2, - 0x7a, 0x59, 0x9e, 0xb8, 0xb7, 0x2f, 0x27, 0xa3, 0x34, 0x45, 0x48, 0x35, 0x70, 0x37, 0xd7, 0x50, - 0xd2, 0xb0, 0x32, 0x87, 0xb6, 0x61, 0x5d, 0x7b, 0xec, 0x85, 0xc1, 0x4e, 0x38, 0x0c, 0x54, 0x87, - 0x57, 0x4e, 0xe7, 0x06, 0x3b, 0xb3, 0x6c, 0x9c, 0x97, 0xdf, 0xfc, 0x89, 0xea, 0x80, 0xcf, 0x04, - 0x9c, 0xef, 0x66, 0x01, 0xe7, 0x52, 0x69, 0x39, 0x6d, 0xb4, 0xb3, 0xb0, 0x75, 0x6a, 0x01, 0xa4, - 0x23, 0x4a, 0x81, 0x01, 0xe5, 0x26, 0xe7, 0x31, 0xa0, 0x3c, 0x04, 0x58, 0xf1, 0x04, 0x06, 0x64, - 0x3c, 0x8c, 0xf2, 0x18, 0xb0, 0xcb, 0xc3, 0x08, 0x4b, 0xce, 0xe2, 0x39, 0x79, 0xf1, 0x2b, 0xfb, - 0x89, 0xef, 0x2f, 0x05, 0x58, 0xd1, 0xa9, 0xe3, 0x1c, 0xa3, 0xdf, 0x18, 0xaa, 0xb1, 0x86, 0xc8, - 0x3a, 0xea, 0x6f, 0x5c, 0x56, 0x33, 0xa8, 0x60, 0x5a, 0x42, 0xc3, 0xc6, 0xce, 0x43, 0xfc, 0x2a, - 0x88, 0x3e, 0xb4, 0xe0, 0x6a, 0x4c, 0x23, 0xdf, 0xe0, 0xe7, 0xe5, 0x13, 0xd4, 0x0c, 0x1c, 0x57, - 0x09, 0x6a, 0x86, 0x84, 0x67, 0x0d, 0xda, 0xbf, 0x2f, 0x40, 0xf1, 0x0e, 0xde, 0x93, 0x38, 0xc6, - 0x39, 0xa1, 0x26, 0x9a, 0x69, 0x09, 0x96, 0x54, 0xac, 0xb9, 0x22, 0xe6, 0x43, 0x46, 0xe3, 0xfc, - 0x81, 0xb9, 0xc3, 0x68, 0x8c, 0x25, 0x47, 0x60, 0xc3, 0x88, 0x30, 0xf6, 0xc3, 0x30, 0x4e, 0xa6, - 0x93, 0x26, 0xe7, 0x1f, 0x69, 0x3a, 0x36, 0x12, 0x42, 0xdf, 0x49, 0xc8, 0xb8, 0xce, 0x0b, 0xe9, - 0x88, 0x37, 0x14, 0x7d, 0x8e, 0xe0, 0x98, 0xf9, 0x65, 0x59, 0x5e, 0xc7, 0x05, 0xf3, 0x4b, 0xd3, - 0xc8, 0x54, 0xce, 0x6c, 0x64, 0x9e, 0x86, 0xf2, 0x07, 0x43, 0x1a, 0x8f, 0xe5, 0x44, 0x25, 0x73, - 0x17, 0xde, 0x16, 0x44, 0xac, 0x78, 0xc2, 0xf1, 0x5e, 0x4c, 0xfa, 0x03, 0xd1, 0x90, 0x54, 0x67, - 0x1d, 0xbf, 0xa5, 0xe9, 0xd8, 0x48, 0xd8, 0x0e, 0xac, 0x66, 0xfe, 0x44, 0xe3, 0x1c, 0x3f, 0xbf, - 0xdf, 0x00, 0x18, 0xd1, 0xd8, 0xeb, 0x8d, 0x77, 0x68, 0xcc, 0xf5, 0xc8, 0xd4, 0xc0, 0xb8, 0xbb, - 0x86, 0x83, 0x33, 0x52, 0xed, 0xe6, 0xa7, 0x5f, 0x6c, 0x5d, 0xf9, 0xec, 0x8b, 0xad, 0x2b, 0x9f, - 0x7f, 0xb1, 0x75, 0xe5, 0xc3, 0xe9, 0x96, 0xf5, 0xe9, 0x74, 0xcb, 0xfa, 0x6c, 0xba, 0x65, 0x7d, - 0x3e, 0xdd, 0xb2, 0xfe, 0x39, 0xdd, 0xb2, 0x3e, 0xf9, 0xd7, 0xd6, 0x95, 0x77, 0xab, 0xc9, 0xee, - 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0x34, 0x35, 0x92, 0x9e, 0xf0, 0x24, 0x00, 0x00, + proto.RegisterFile("github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1/generated.proto", fileDescriptor_generated_558b4bfc5fa3d402) +} + +var fileDescriptor_generated_558b4bfc5fa3d402 = []byte{ + // 2687 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0x5f, 0x6f, 0x1b, 0xc7, + 0x11, 0xf7, 0xf1, 0x9f, 0xc8, 0x91, 0x1c, 0xc9, 0x9b, 0x04, 0x21, 0x14, 0x44, 0x74, 0x2f, 0x68, + 0x90, 0x16, 0x09, 0x99, 0x58, 0x75, 0xe0, 0x16, 0x48, 0x1b, 0x51, 0x94, 0x63, 0x59, 0xb2, 0x2c, + 0x2f, 0x63, 0x17, 0x70, 0x03, 0xd4, 0xa7, 0xbb, 0x25, 0x75, 0xd6, 0xf1, 0xee, 0x7c, 0xbb, 0x64, + 0xcd, 0xa2, 0x68, 0xd3, 0xb4, 0x7d, 0x09, 0x8a, 0xc2, 0x6f, 0x7d, 0xe8, 0x63, 0xbf, 0x43, 0xd1, + 0xb7, 0xa2, 0x7d, 0xf2, 0x4b, 0x81, 0x14, 0x05, 0x8a, 0xf4, 0x85, 0xa8, 0x59, 0xa0, 0x0f, 0xfd, + 0x08, 0x7e, 0x2a, 0xf6, 0xcf, 0xed, 0x1d, 0x8f, 0x54, 0x2d, 0x8b, 0x02, 0xfc, 0x92, 0xf0, 0x66, + 0x66, 0x67, 0x66, 0x67, 0x77, 0x67, 0x7e, 0x33, 0x32, 0x5c, 0xeb, 0xba, 0xec, 0xb0, 0x7f, 0x50, + 0xb7, 0x83, 0x5e, 0xc3, 0x8a, 0xba, 0x41, 0x18, 0x05, 0xf7, 0xc5, 0x8f, 0x77, 0xc9, 0x80, 0xf8, + 0x8c, 0x36, 0xc2, 0xa3, 0x6e, 0xc3, 0x0a, 0x5d, 0xda, 0xa0, 0xc4, 0xa7, 0x41, 0xd4, 0x18, 0xbc, + 0x6f, 0x79, 0xe1, 0xa1, 0xf5, 0x7e, 0xa3, 0x4b, 0x7c, 0x12, 0x59, 0x8c, 0x38, 0xf5, 0x30, 0x0a, + 0x58, 0x80, 0xae, 0x24, 0x9a, 0xea, 0xb1, 0x26, 0xf1, 0xe3, 0x87, 0x52, 0x53, 0x3d, 0x3c, 0xea, + 0xd6, 0xb9, 0xa6, 0xba, 0xd4, 0x54, 0x8f, 0x35, 0xad, 0xbe, 0x9b, 0xf2, 0xa1, 0x1b, 0x74, 0x83, + 0x86, 0x50, 0x78, 0xd0, 0xef, 0x88, 0x2f, 0xf1, 0x21, 0x7e, 0x49, 0x43, 0xab, 0xe6, 0xd1, 0x15, + 0x5a, 0x77, 0x03, 0xee, 0x55, 0xc3, 0x0e, 0x22, 0xd2, 0x18, 0x4c, 0x39, 0xb3, 0xfa, 0xad, 0x44, + 0xa6, 0x67, 0xd9, 0x87, 0xae, 0x4f, 0xa2, 0x61, 0xb2, 0x95, 0x1e, 0x61, 0xd6, 0xac, 0x55, 0x8d, + 0xe3, 0x56, 0x45, 0x7d, 0x9f, 0xb9, 0x3d, 0x32, 0xb5, 0xe0, 0x83, 0x67, 0x2d, 0xa0, 0xf6, 0x21, + 0xe9, 0x59, 0x53, 0xeb, 0xd6, 0x8f, 0x5b, 0xd7, 0x67, 0xae, 0xd7, 0x70, 0x7d, 0x46, 0x59, 0x94, + 0x5d, 0x64, 0xfe, 0x23, 0x0f, 0x2b, 0x1b, 0x11, 0x73, 0x3b, 0x96, 0xcd, 0x76, 0x03, 0xdb, 0x62, + 0x6e, 0xe0, 0xa3, 0x4f, 0x21, 0x47, 0xd7, 0xab, 0xc6, 0x45, 0xe3, 0xed, 0xc5, 0x4b, 0xad, 0xfa, + 0x69, 0x8f, 0xa0, 0xde, 0x5e, 0x8f, 0x35, 0x37, 0x4b, 0xe3, 0x51, 0x2d, 0xd7, 0x5e, 0xc7, 0x39, + 0xba, 0x8e, 0x4c, 0x28, 0xb9, 0xbe, 0xe7, 0xfa, 0xa4, 0x9a, 0xbb, 0x68, 0xbc, 0x5d, 0x69, 0xc2, + 0x78, 0x54, 0x2b, 0x6d, 0x0b, 0x0a, 0x56, 0x1c, 0xe4, 0x40, 0xa1, 0xe3, 0x7a, 0xa4, 0x9a, 0x17, + 0x3e, 0x5c, 0x3d, 0xbd, 0x0f, 0x57, 0x5d, 0x8f, 0x68, 0x2f, 0xca, 0xe3, 0x51, 0xad, 0xc0, 0x29, + 0x58, 0x68, 0x47, 0xf7, 0x20, 0xdf, 0x8f, 0xbc, 0x6a, 0x41, 0x18, 0xd9, 0x3a, 0xbd, 0x91, 0xdb, + 0x78, 0x57, 0xdb, 0x58, 0x18, 0x8f, 0x6a, 0xf9, 0xdb, 0x78, 0x17, 0x73, 0xd5, 0xe8, 0x21, 0x54, + 0xec, 0xc0, 0xef, 0xb8, 0xdd, 0x9e, 0x15, 0x56, 0x8b, 0xc2, 0xce, 0xce, 0xe9, 0xed, 0x6c, 0xc6, + 0xaa, 0xb4, 0xb5, 0xf3, 0xe3, 0x51, 0xad, 0xa2, 0xc9, 0x38, 0x31, 0x66, 0xfe, 0xca, 0x80, 0x0b, + 0x53, 0xf2, 0xe8, 0x22, 0x14, 0x7c, 0xab, 0x47, 0xc4, 0xd9, 0x56, 0x9a, 0x4b, 0x8f, 0x47, 0xb5, + 0x73, 0x3c, 0x26, 0x7b, 0x56, 0x8f, 0x60, 0xc1, 0x41, 0x0d, 0xa8, 0xf0, 0xff, 0xd3, 0xd0, 0xb2, + 0xe3, 0x03, 0xba, 0xa0, 0xc4, 0x2a, 0x7b, 0x31, 0x03, 0x27, 0x32, 0xe8, 0x0d, 0xc8, 0x1f, 0x91, + 0xa1, 0x38, 0xa9, 0x4a, 0x73, 0x51, 0x89, 0xe6, 0x77, 0xc8, 0x10, 0x73, 0xba, 0xf9, 0x79, 0x0e, + 0x0a, 0x2d, 0x8b, 0x59, 0xe8, 0x08, 0x16, 0x3a, 0xae, 0xc7, 0x48, 0x44, 0xab, 0xc6, 0xc5, 0xfc, + 0x7c, 0x37, 0x8b, 0x2b, 0xbc, 0x2a, 0x94, 0x35, 0x17, 0xc7, 0xa3, 0xda, 0x82, 0xfc, 0x4d, 0x71, + 0x6c, 0x01, 0xfd, 0xda, 0x80, 0x15, 0x42, 0x6d, 0xcb, 0x13, 0x17, 0x7a, 0x3f, 0xf0, 0x5c, 0x7b, + 0x28, 0x76, 0xb3, 0x78, 0xe9, 0xfa, 0xe9, 0xcd, 0x6e, 0x65, 0x34, 0x36, 0x5f, 0x19, 0x8f, 0x6a, + 0x2b, 0x59, 0x2a, 0x9e, 0xb2, 0x6c, 0x3e, 0xca, 0x01, 0x24, 0x3e, 0xf3, 0x53, 0x08, 0x2d, 0x76, + 0x98, 0x3d, 0x85, 0x7d, 0x8b, 0x1d, 0x62, 0xc1, 0x41, 0xef, 0x40, 0x81, 0x0d, 0xc3, 0xf8, 0x00, + 0xaa, 0xb1, 0xc4, 0x27, 0xc3, 0x90, 0x3c, 0x1d, 0xd5, 0xca, 0xd7, 0xdb, 0x37, 0xf7, 0xf8, 0x6f, + 0x2c, 0xa4, 0xd0, 0x9b, 0x50, 0x1c, 0x58, 0x5e, 0x9f, 0xa8, 0x43, 0x38, 0xaf, 0xc4, 0x8b, 0x77, + 0x38, 0x11, 0x4b, 0xde, 0xec, 0x90, 0x14, 0x5e, 0x58, 0x48, 0x7e, 0x6b, 0xc0, 0x94, 0xd8, 0x09, + 0xae, 0xe7, 0x07, 0x50, 0xf4, 0xc8, 0x80, 0x78, 0x2a, 0x32, 0x17, 0xe3, 0xad, 0xee, 0x72, 0xe2, + 0xd3, 0x51, 0x6d, 0x39, 0xd1, 0x29, 0x48, 0x58, 0x8a, 0xa3, 0x6f, 0xc0, 0x42, 0x8f, 0x50, 0x6a, + 0x75, 0xe3, 0x20, 0x2d, 0xab, 0x95, 0x0b, 0x37, 0x24, 0x19, 0xc7, 0x7c, 0xf3, 0x77, 0x06, 0x14, + 0xb7, 0xf8, 0xb6, 0xd1, 0x03, 0x58, 0xb0, 0x03, 0x9f, 0x91, 0x87, 0x4c, 0x25, 0xc3, 0x39, 0x12, + 0x91, 0xd0, 0xb8, 0x29, 0xb5, 0x25, 0xc6, 0x15, 0x01, 0xc7, 0x76, 0x50, 0x0d, 0x0a, 0x8e, 0xc5, + 0x2c, 0xb1, 0xbd, 0x25, 0x79, 0xb9, 0xf7, 0xad, 0xa1, 0x17, 0x58, 0x0e, 0x16, 0x0c, 0xf3, 0x4f, + 0x0b, 0xb0, 0x94, 0xd6, 0xc5, 0x1f, 0xac, 0xb0, 0xcd, 0xef, 0x83, 0x0a, 0x9c, 0x7e, 0xb0, 0x5b, + 0x31, 0x03, 0x27, 0x32, 0xa8, 0x05, 0x2b, 0xfa, 0xe3, 0x0e, 0x89, 0xa8, 0x1b, 0xf8, 0x99, 0x7b, + 0xb6, 0xb2, 0x95, 0xe1, 0xe3, 0xa9, 0x15, 0xe8, 0x3a, 0x20, 0xdb, 0x0b, 0xfa, 0x8e, 0x10, 0xa5, + 0xb1, 0x1e, 0x19, 0xdb, 0x55, 0xa5, 0x07, 0x6d, 0x4e, 0x49, 0xe0, 0x19, 0xab, 0x90, 0x05, 0x25, + 0x1a, 0xf4, 0x23, 0x9b, 0xa8, 0xfb, 0xf8, 0xe1, 0x3c, 0xa9, 0x78, 0x5b, 0x16, 0x94, 0xb6, 0x50, + 0x88, 0x95, 0x62, 0x7e, 0xfe, 0x62, 0xe9, 0x76, 0x4b, 0xa4, 0xe1, 0xd4, 0xf9, 0x6f, 0x49, 0x32, + 0x8e, 0xf9, 0xe8, 0x5e, 0x1c, 0x50, 0xb7, 0x47, 0xaa, 0x25, 0xe1, 0x50, 0xa3, 0x2e, 0x6b, 0x6b, + 0x3d, 0x5d, 0x5b, 0x13, 0x27, 0x78, 0xe9, 0xaf, 0x0f, 0xde, 0xaf, 0xdf, 0x70, 0xed, 0x28, 0xe0, + 0xcb, 0xb2, 0x27, 0xe0, 0xf6, 0xf4, 0x09, 0xb8, 0x3d, 0x82, 0xee, 0x43, 0x45, 0xd6, 0xf0, 0xdb, + 0x78, 0xb7, 0xba, 0x70, 0x16, 0x5b, 0x16, 0x75, 0xa0, 0x1d, 0xeb, 0xc4, 0x89, 0x7a, 0x74, 0x19, + 0x16, 0xc5, 0xdd, 0x52, 0x17, 0xa4, 0x2c, 0x36, 0xff, 0xb2, 0x72, 0x6f, 0x71, 0x33, 0x61, 0xe1, + 0xb4, 0x1c, 0xfa, 0xc2, 0x00, 0x20, 0x0f, 0x19, 0xf1, 0xf9, 0x01, 0xd1, 0x6a, 0x45, 0x64, 0xec, + 0x3b, 0x67, 0x73, 0xfd, 0xeb, 0x5b, 0x5a, 0xf1, 0x96, 0xcf, 0xa2, 0x61, 0x13, 0x29, 0x77, 0x20, + 0x61, 0xe0, 0x94, 0xf5, 0xd9, 0xa9, 0x0b, 0x5e, 0x54, 0xea, 0x5a, 0xfd, 0x10, 0x96, 0x33, 0x3b, + 0x40, 0x2b, 0xb2, 0x08, 0x8a, 0xe7, 0x27, 0xea, 0x1e, 0x7a, 0x25, 0xce, 0xc9, 0xe2, 0x69, 0xa9, + 0x24, 0xfc, 0x9d, 0xdc, 0x15, 0xc3, 0xfc, 0x4d, 0x0e, 0x96, 0x45, 0x38, 0x5a, 0x24, 0x24, 0xbe, + 0x43, 0xfc, 0x13, 0x25, 0xbe, 0x77, 0xa0, 0xec, 0x10, 0xcb, 0xd1, 0xb8, 0x29, 0xdf, 0x5c, 0x51, + 0x52, 0xe5, 0x96, 0xa2, 0x63, 0x2d, 0x81, 0x7e, 0x9c, 0x14, 0x5b, 0x09, 0xa1, 0x6e, 0xce, 0x79, + 0x74, 0x89, 0xaf, 0xaa, 0xee, 0xea, 0xf7, 0x33, 0x55, 0x7b, 0x1b, 0x02, 0xf3, 0xf8, 0xc4, 0x66, + 0xc4, 0x11, 0x0f, 0xba, 0x9c, 0x3c, 0x87, 0xcd, 0x98, 0x81, 0x13, 0x19, 0xf3, 0xbf, 0x39, 0x78, + 0x75, 0xa6, 0x91, 0x13, 0x84, 0xe5, 0x00, 0x0a, 0x1c, 0x13, 0xab, 0xda, 0x3e, 0x07, 0xa4, 0xe0, + 0x0f, 0x53, 0x6d, 0x4d, 0xc0, 0x44, 0xf1, 0x66, 0x85, 0x6e, 0xd4, 0x4b, 0xca, 0x40, 0xfe, 0x4c, + 0xcb, 0xc0, 0xe2, 0xcc, 0x12, 0xf0, 0xa9, 0x2a, 0x01, 0x32, 0x17, 0x7e, 0x77, 0x3e, 0x94, 0x24, + 0x37, 0xc3, 0x7f, 0xa9, 0xfa, 0xf1, 0x45, 0x0e, 0xce, 0x0b, 0x27, 0xf6, 0x39, 0xfe, 0xb7, 0x03, + 0x0f, 0x5d, 0x56, 0x58, 0x43, 0x06, 0xf9, 0x6b, 0x19, 0xac, 0x71, 0x61, 0x42, 0x38, 0x05, 0x3a, + 0xee, 0x41, 0xe1, 0x90, 0xb1, 0x50, 0x45, 0x7e, 0x0e, 0x37, 0xaf, 0x31, 0x16, 0x26, 0x67, 0xcb, + 0xbf, 0xb0, 0xd0, 0xcc, 0x2d, 0xf8, 0x16, 0x8b, 0x6f, 0xf0, 0x1c, 0x16, 0xf6, 0x2c, 0x46, 0xd3, + 0xb7, 0x87, 0x51, 0x2c, 0x34, 0x9b, 0xef, 0xc1, 0x52, 0xba, 0x41, 0x78, 0x36, 0x30, 0x33, 0x7f, + 0x69, 0xc0, 0xca, 0xc7, 0x51, 0xd0, 0x0f, 0x55, 0xed, 0xda, 0x71, 0x7d, 0x87, 0xe3, 0xaf, 0x2e, + 0xa7, 0xa9, 0x75, 0x1a, 0x7f, 0x09, 0x41, 0x2c, 0x79, 0xbc, 0x02, 0x0d, 0x26, 0xaa, 0xad, 0x7e, + 0x41, 0x71, 0x69, 0x8c, 0xf9, 0xdc, 0x8d, 0x23, 0xd7, 0x77, 0x54, 0x35, 0xd5, 0x6e, 0x70, 0x5b, + 0x58, 0x70, 0xcc, 0xb7, 0x41, 0x04, 0x4a, 0x38, 0x1c, 0x44, 0x6c, 0xca, 0xe1, 0x20, 0x62, 0x58, + 0x70, 0xcc, 0x3f, 0x17, 0x40, 0xec, 0x98, 0xe3, 0x74, 0xde, 0xec, 0x18, 0x93, 0x38, 0x5d, 0x77, + 0x2a, 0x6d, 0x78, 0x95, 0x32, 0x2b, 0x62, 0xdf, 0x77, 0xd9, 0xe1, 0xae, 0x45, 0x19, 0x26, 0x36, + 0x71, 0x07, 0xc4, 0x11, 0xce, 0x96, 0x9b, 0x6f, 0xa8, 0x05, 0xaf, 0xb6, 0x67, 0x09, 0xe1, 0xd9, + 0x6b, 0xd1, 0x0d, 0x78, 0xd9, 0x21, 0x9e, 0x3b, 0x20, 0xd1, 0x86, 0xe7, 0x6d, 0x0c, 0x2c, 0xd7, + 0xb3, 0x0e, 0x54, 0x57, 0x57, 0x6e, 0xbe, 0xae, 0x54, 0xbe, 0xdc, 0x9a, 0x16, 0xc1, 0xb3, 0xd6, + 0xa1, 0x0d, 0x58, 0x16, 0x76, 0x36, 0x58, 0x9b, 0x3c, 0xe8, 0x13, 0x5f, 0x01, 0x86, 0x4a, 0xf3, + 0x35, 0xa5, 0x6a, 0xb9, 0x3d, 0xc9, 0xc6, 0x59, 0x79, 0x5e, 0x0e, 0x15, 0x49, 0x94, 0xf7, 0xe2, + 0x64, 0x39, 0x6c, 0x27, 0x2c, 0x9c, 0x96, 0xe3, 0x98, 0x29, 0xf5, 0xd9, 0x22, 0x1e, 0xb3, 0x04, + 0x34, 0x48, 0x61, 0xa6, 0x76, 0x86, 0x8f, 0xa7, 0x56, 0xf0, 0x2b, 0xe0, 0xf4, 0x23, 0x11, 0x82, + 0x05, 0x11, 0x02, 0x7d, 0x05, 0x5a, 0x92, 0x8c, 0x63, 0xbe, 0x48, 0xa2, 0x5e, 0x9f, 0x32, 0x12, + 0x6d, 0x3b, 0xaa, 0x68, 0x27, 0x49, 0x34, 0x66, 0xe0, 0x44, 0x86, 0xd7, 0x07, 0xdb, 0x73, 0x39, + 0x82, 0x71, 0xaa, 0x15, 0x21, 0xaf, 0xeb, 0xc3, 0xa6, 0xa2, 0x63, 0x2d, 0xa1, 0xfb, 0x0b, 0x98, + 0xdd, 0x5f, 0xf0, 0x0b, 0x93, 0x3c, 0x75, 0xf3, 0x8f, 0x05, 0x80, 0xbd, 0xc0, 0x21, 0x6d, 0x66, + 0xb1, 0x3e, 0x45, 0xab, 0x90, 0x73, 0x1d, 0x75, 0x91, 0x40, 0x2d, 0xcd, 0x6d, 0xb7, 0x70, 0xce, + 0x75, 0x74, 0xc6, 0xce, 0x1d, 0x9b, 0xb1, 0x2f, 0xc3, 0xa2, 0xe3, 0xd2, 0xd0, 0xb3, 0x86, 0x9c, + 0xa8, 0xee, 0xb8, 0x3e, 0x81, 0x56, 0xc2, 0xc2, 0x69, 0x39, 0xed, 0x71, 0xe1, 0x18, 0x8f, 0x03, + 0x87, 0xa4, 0x92, 0xd3, 0x7b, 0x50, 0x0c, 0x0f, 0x2d, 0x1a, 0x1f, 0x70, 0x0c, 0x48, 0x8b, 0xfb, + 0x9c, 0xf8, 0x94, 0xb7, 0xb2, 0x81, 0x43, 0xc4, 0x07, 0x96, 0x82, 0x1c, 0xf5, 0x89, 0xf3, 0x22, + 0xce, 0x06, 0x9b, 0x1b, 0xf5, 0xb5, 0x63, 0x4d, 0x38, 0x51, 0x8a, 0x3a, 0x1c, 0x89, 0xf5, 0x42, + 0x8f, 0x48, 0x1b, 0x0b, 0xa7, 0xb3, 0x91, 0x82, 0x6e, 0x5a, 0x17, 0x4e, 0x2b, 0x4e, 0xb7, 0x3a, + 0xe5, 0xff, 0xdf, 0xea, 0xa0, 0x7b, 0x50, 0x14, 0xb9, 0x53, 0xdc, 0x98, 0xc5, 0x4b, 0xdf, 0x9b, + 0xb3, 0xae, 0x35, 0x2b, 0x3c, 0xc6, 0xe2, 0x27, 0x96, 0x8a, 0xcd, 0xcf, 0x8b, 0xf0, 0x12, 0x26, + 0x12, 0x84, 0xdf, 0x3c, 0xb8, 0x4f, 0x6c, 0x36, 0x39, 0x61, 0x30, 0x4e, 0x30, 0x61, 0xf8, 0x09, + 0x94, 0x3c, 0xeb, 0x80, 0x78, 0xbc, 0x12, 0x70, 0x18, 0xfa, 0xc9, 0xe9, 0xdd, 0x9c, 0x74, 0xa5, + 0xbe, 0x2b, 0xd4, 0x4a, 0x10, 0xfa, 0x92, 0xf2, 0xa1, 0x24, 0x89, 0x58, 0xd9, 0x44, 0x3f, 0x03, + 0x08, 0xad, 0xc8, 0xea, 0x11, 0x81, 0xa6, 0x0a, 0xc2, 0x83, 0x9d, 0xf9, 0x3d, 0xd8, 0x8f, 0x75, + 0x26, 0xe8, 0x57, 0x93, 0x28, 0x4e, 0x99, 0x44, 0x8f, 0x0c, 0x58, 0xe9, 0x66, 0x4a, 0x8e, 0x9a, + 0x25, 0xcd, 0x81, 0x7e, 0xb3, 0x45, 0x2c, 0x49, 0x64, 0x59, 0x0e, 0x9e, 0xb2, 0x8e, 0x22, 0xdd, + 0xb0, 0x95, 0xe6, 0xf5, 0x23, 0x3b, 0x7c, 0x4c, 0xce, 0x61, 0xb2, 0x83, 0x5b, 0xfd, 0x36, 0x2c, + 0xa6, 0x8e, 0xeb, 0xb9, 0x10, 0xf7, 0xef, 0x0d, 0xb8, 0x30, 0x15, 0x77, 0xe4, 0x41, 0x9e, 0x46, + 0xb6, 0xea, 0xec, 0x6f, 0x9d, 0xe1, 0x89, 0x4a, 0xc7, 0xe5, 0x24, 0xb0, 0x1d, 0xd9, 0x98, 0x9b, + 0xe1, 0x89, 0xd1, 0x21, 0x94, 0x65, 0x13, 0x63, 0x8b, 0x50, 0x86, 0x05, 0xc7, 0xfc, 0xb9, 0x01, + 0xaf, 0x1d, 0xa3, 0x8b, 0x23, 0x0c, 0xf9, 0x50, 0x33, 0x08, 0x23, 0xfd, 0xd6, 0x34, 0x7a, 0xc9, + 0x1d, 0x3b, 0x56, 0xaa, 0x4d, 0x0e, 0x8a, 0x2a, 0xd9, 0x21, 0x91, 0xb9, 0x0c, 0xe7, 0x31, 0x61, + 0xd1, 0xb0, 0xcd, 0x22, 0x8b, 0x91, 0xee, 0xd0, 0xfc, 0x67, 0x0e, 0x20, 0x99, 0xe3, 0xc6, 0xc3, + 0x3e, 0x63, 0xf6, 0xb0, 0x0f, 0xdd, 0x89, 0xdd, 0x94, 0x2e, 0x7c, 0x34, 0xe1, 0xe6, 0xd3, 0x51, + 0xad, 0x91, 0x1a, 0xca, 0xf7, 0x5c, 0xdf, 0x0d, 0xe4, 0x7f, 0xdf, 0xed, 0x06, 0xf5, 0xbd, 0x80, + 0xb9, 0x1d, 0x57, 0xde, 0x81, 0x64, 0x6c, 0xa1, 0x76, 0xd6, 0x81, 0x92, 0xec, 0x2e, 0x14, 0x16, + 0x6c, 0xce, 0x33, 0x94, 0x56, 0x28, 0x5f, 0x4c, 0x09, 0xe4, 0x6f, 0xac, 0xb4, 0x23, 0x0f, 0xca, + 0x74, 0xbd, 0xd9, 0xb7, 0x8f, 0x08, 0x53, 0xf0, 0x7b, 0x2e, 0x4b, 0x52, 0x53, 0x73, 0x89, 0x17, + 0xe1, 0xf8, 0x0b, 0x6b, 0x0b, 0xe6, 0x28, 0x07, 0x9a, 0xcc, 0xeb, 0x37, 0xf1, 0x9d, 0x30, 0x70, + 0xf5, 0x21, 0xeb, 0xfa, 0xbd, 0xa5, 0xe8, 0x58, 0x4b, 0xa0, 0xb7, 0xa0, 0x74, 0x20, 0xdd, 0x94, + 0x91, 0xd6, 0x8f, 0x46, 0x19, 0x51, 0x5c, 0x2e, 0x17, 0x91, 0x6e, 0x32, 0x99, 0xd1, 0x72, 0x58, + 0x50, 0xb1, 0xe2, 0x72, 0xeb, 0xae, 0x4f, 0x89, 0xdd, 0x8f, 0x88, 0x6a, 0xd9, 0xb4, 0xf5, 0x6d, + 0x45, 0xc7, 0x5a, 0x02, 0x61, 0xa8, 0x58, 0xb6, 0x4d, 0x28, 0xdd, 0x21, 0x43, 0x95, 0x89, 0xbe, + 0x9e, 0xaa, 0x63, 0x75, 0x3b, 0x88, 0x08, 0xaf, 0x5a, 0x6d, 0x62, 0x47, 0x84, 0xed, 0x90, 0x61, + 0x9b, 0x78, 0xc4, 0x66, 0x41, 0x24, 0xe7, 0x14, 0x1b, 0xf1, 0x5a, 0x9c, 0xa8, 0xe1, 0x3a, 0x69, + 0x2c, 0xae, 0xb2, 0xca, 0xf3, 0xe8, 0xd4, 0x64, 0x9c, 0xa8, 0x31, 0xef, 0xf2, 0xf8, 0xaa, 0x56, + 0xf2, 0x2d, 0x28, 0x85, 0x11, 0xe9, 0xb8, 0x0f, 0x55, 0x74, 0x75, 0x24, 0xf6, 0x05, 0x15, 0x2b, + 0x2e, 0x97, 0xa3, 0xfd, 0x0e, 0x97, 0xcb, 0x44, 0xb6, 0x2d, 0xa8, 0x58, 0x71, 0xcd, 0xbf, 0xe4, + 0xa0, 0xd4, 0x16, 0x27, 0x8e, 0xee, 0x41, 0x99, 0xd7, 0x69, 0xd1, 0xb4, 0xc9, 0x6c, 0xf2, 0xde, + 0xc9, 0xaa, 0xba, 0xac, 0x42, 0x37, 0x08, 0xb3, 0x92, 0x22, 0x90, 0xd0, 0xb0, 0xd6, 0x8a, 0x3a, + 0x50, 0xa0, 0x21, 0xb1, 0xe7, 0xef, 0x72, 0xa5, 0xc7, 0xed, 0x90, 0xd8, 0x49, 0x7e, 0xe0, 0x5f, + 0x58, 0xe8, 0x47, 0x3e, 0x94, 0xa8, 0xc0, 0x78, 0xf3, 0x37, 0xba, 0xca, 0x92, 0xd0, 0x96, 0x0a, + 0xa2, 0xf8, 0xc6, 0xca, 0x8a, 0xf9, 0x37, 0x03, 0x40, 0x0a, 0xee, 0xba, 0x94, 0x77, 0xbe, 0xd9, + 0x40, 0xd6, 0x4f, 0x16, 0x48, 0xbe, 0x5a, 0x84, 0x51, 0xdf, 0xda, 0x98, 0x92, 0x0a, 0x22, 0x81, + 0xa2, 0xcb, 0x48, 0x8f, 0x56, 0x73, 0xa2, 0x86, 0x7f, 0x34, 0xef, 0xde, 0x92, 0x2c, 0xbc, 0xcd, + 0xd5, 0x62, 0xa9, 0xdd, 0xfc, 0x7b, 0x3e, 0xde, 0x13, 0x0f, 0x2c, 0xfa, 0x85, 0x01, 0x4b, 0x4e, + 0x3c, 0xd7, 0x70, 0x49, 0xfc, 0xc7, 0x8f, 0xed, 0x33, 0x9b, 0xc7, 0x34, 0x5f, 0x51, 0x6e, 0x2c, + 0xb5, 0x52, 0x66, 0xf0, 0x84, 0x51, 0x14, 0x40, 0x99, 0x45, 0x6e, 0xb7, 0xcb, 0x21, 0x8c, 0xdc, + 0xfe, 0xc6, 0x1c, 0xa3, 0x12, 0xa9, 0x29, 0x09, 0xb6, 0x22, 0x50, 0xac, 0x8d, 0xa0, 0x1d, 0x00, + 0x87, 0x84, 0x5e, 0x30, 0xe4, 0x41, 0x50, 0xb7, 0xe9, 0xf5, 0x59, 0xef, 0x79, 0x3f, 0x70, 0xc4, + 0x75, 0x7c, 0x89, 0x5f, 0xfe, 0x96, 0x5e, 0x82, 0x53, 0xcb, 0xd1, 0x67, 0x06, 0x9c, 0x27, 0xe9, + 0x31, 0x84, 0x4a, 0xce, 0x1f, 0xcf, 0x19, 0xc4, 0x58, 0x5d, 0xf3, 0xc2, 0x78, 0x54, 0x9b, 0x9c, + 0x8a, 0xe0, 0x49, 0x83, 0xe6, 0x7f, 0x0a, 0xb0, 0x94, 0xbe, 0xd2, 0x49, 0x87, 0x61, 0x9c, 0xb4, + 0xc3, 0xf8, 0x41, 0xba, 0xc3, 0x90, 0x2f, 0xf9, 0x9b, 0x27, 0xbb, 0xde, 0x27, 0x68, 0x2e, 0xac, + 0xc9, 0xe6, 0x22, 0xff, 0xdc, 0xea, 0x9f, 0xab, 0xaf, 0x28, 0x3c, 0xa3, 0xaf, 0x18, 0x40, 0xd1, + 0x0f, 0x1c, 0x42, 0xab, 0x45, 0x71, 0xd7, 0x6e, 0x9d, 0x4d, 0x1a, 0xa9, 0xf3, 0x90, 0x2a, 0xb4, + 0xae, 0xdf, 0x9e, 0xa0, 0x61, 0x69, 0x0e, 0x6d, 0xc0, 0xb2, 0xf2, 0xd8, 0x0d, 0xfc, 0xcd, 0xa0, + 0xef, 0xcb, 0x56, 0xae, 0x98, 0x0c, 0x08, 0x36, 0x27, 0xd9, 0x38, 0x2b, 0xbf, 0xfa, 0x53, 0xd9, + 0xea, 0x1e, 0x8b, 0x32, 0xef, 0xa6, 0x51, 0xe6, 0x5c, 0xb9, 0x38, 0xe9, 0xa8, 0xd3, 0x58, 0x75, + 0x6c, 0x00, 0x24, 0xb3, 0x48, 0x0e, 0xfc, 0xc4, 0x21, 0x67, 0x81, 0x9f, 0xb8, 0x04, 0x58, 0xf2, + 0x38, 0xf0, 0xa3, 0x2c, 0x08, 0xb3, 0xc0, 0xaf, 0xcd, 0x82, 0x10, 0x0b, 0xce, 0xec, 0x09, 0x7a, + 0xfe, 0x85, 0xfd, 0xf1, 0xef, 0xaf, 0x39, 0x58, 0x50, 0x49, 0xe3, 0x04, 0x33, 0xde, 0x08, 0xca, + 0x91, 0xc2, 0xc5, 0x2a, 0xea, 0xd7, 0xce, 0xaa, 0x03, 0x94, 0xd8, 0x2c, 0xa6, 0x61, 0x6d, 0xe7, + 0x39, 0xfe, 0x5e, 0x28, 0xb2, 0x53, 0x44, 0x42, 0x4f, 0x83, 0xe6, 0xf9, 0xb3, 0xd3, 0x04, 0x06, + 0x97, 0xd9, 0x69, 0x82, 0x84, 0x27, 0x0d, 0x9a, 0x7f, 0xc8, 0x41, 0xfe, 0x36, 0xde, 0x16, 0xe0, + 0xc5, 0x3e, 0x24, 0x3a, 0x9a, 0x49, 0xdd, 0x15, 0x54, 0xac, 0xb8, 0x3c, 0xe6, 0x7d, 0x4a, 0xa2, + 0xec, 0x85, 0xb9, 0x4d, 0x49, 0x84, 0x05, 0x87, 0x03, 0xc2, 0xd0, 0xa2, 0xf4, 0x47, 0x41, 0x14, + 0x8f, 0x21, 0x75, 0xb6, 0xdf, 0x57, 0x74, 0xac, 0x25, 0xb8, 0xbe, 0xc3, 0x80, 0x32, 0x95, 0x17, + 0x92, 0x59, 0x6e, 0xc0, 0x9b, 0x1b, 0xce, 0xd1, 0x83, 0xca, 0xa2, 0x78, 0x8e, 0x33, 0x06, 0x95, + 0xba, 0x7b, 0x29, 0x1d, 0xdb, 0xbd, 0xbc, 0x09, 0xc5, 0x07, 0x7d, 0x12, 0x0d, 0xc5, 0xe8, 0x24, + 0xf5, 0x16, 0x6e, 0x71, 0x22, 0x96, 0x3c, 0xee, 0x78, 0x27, 0xb2, 0xba, 0x3d, 0xde, 0x85, 0x94, + 0x27, 0x1d, 0xbf, 0xaa, 0xe8, 0x58, 0x4b, 0x98, 0x36, 0x2c, 0xa6, 0xfe, 0xf1, 0xc6, 0x09, 0xfe, + 0x30, 0x7f, 0x09, 0x60, 0x40, 0x22, 0xb7, 0x33, 0xdc, 0x24, 0x11, 0x53, 0xb3, 0x51, 0x8d, 0xdd, + 0xee, 0x68, 0x0e, 0x4e, 0x49, 0x35, 0xeb, 0x8f, 0x9f, 0xac, 0x9d, 0xfb, 0xf2, 0xc9, 0xda, 0xb9, + 0xaf, 0x9e, 0xac, 0x9d, 0xfb, 0x6c, 0xbc, 0x66, 0x3c, 0x1e, 0xaf, 0x19, 0x5f, 0x8e, 0xd7, 0x8c, + 0xaf, 0xc6, 0x6b, 0xc6, 0xbf, 0xc6, 0x6b, 0xc6, 0xa3, 0x7f, 0xaf, 0x9d, 0xbb, 0x5b, 0x8e, 0x4f, + 0xff, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xd1, 0xc2, 0x4e, 0x6e, 0x3f, 0x25, 0x00, 0x00, } diff --git a/pkg/apis/sensor/v1alpha1/generated.proto b/pkg/apis/sensor/v1alpha1/generated.proto index 633d1d4683..a0fc576083 100644 --- a/pkg/apis/sensor/v1alpha1/generated.proto +++ b/pkg/apis/sensor/v1alpha1/generated.proto @@ -23,6 +23,7 @@ import "k8s.io/api/core/v1/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; +import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; // Package-wide variables from generator "generated". option go_package = "v1alpha1"; @@ -130,8 +131,6 @@ message EventContext { // Enables deduplication. Must be unique within scope of producer. optional string eventID = 5; - // Timestamp of when the event happened. Must adhere to format specified in RFC 3339. - // +k8s:openapi-gen=false optional k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime eventTime = 6; // A link to the schema that the data attribute adheres to. @@ -167,6 +166,9 @@ message EventDependency { // Filters and rules governing tolerations of success and constraints on the context and data of an event optional EventDependencyFilter filters = 3; + + // Connected tells if subscription is already setup in case of nats protocol. + optional bool connected = 4; } // EventDependencyFilter defines filters and constraints for a event. @@ -270,18 +272,16 @@ message NodeStatus { optional string phase = 5; // StartedAt is the time at which this node started - // +k8s:openapi-gen=false optional k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime startedAt = 6; // CompletedAt is the time at which this node completed - // +k8s:openapi-gen=false optional k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime completedAt = 7; // store data or something to save for event notifications or trigger events optional string message = 8; // Event stores the last seen event for this node - optional Event latestEvent = 9; + optional Event event = 9; } // ResourceObject is the resource object to create on kubernetes @@ -290,7 +290,6 @@ message ResourceObject { optional GroupVersionKind groupVersionKind = 5; // Namespace in which to create this object - // optional // defaults to the service account namespace optional string namespace = 1; @@ -360,10 +359,8 @@ message S3Bucket { optional bool insecure = 4; - // +k8s:openapi-gen=false optional k8s.io.api.core.v1.SecretKeySelector accessKey = 5; - // +k8s:openapi-gen=false optional k8s.io.api.core.v1.SecretKeySelector secretKey = 6; } @@ -380,7 +377,6 @@ message S3Filter { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // +k8s:openapi-gen=true message Sensor { - // +k8s:openapi-gen=false optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; optional SensorSpec spec = 2; @@ -391,7 +387,6 @@ message Sensor { // SensorList is the list of Sensor resources // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object message SensorList { - // +k8s:openapi-gen=false optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; repeated Sensor items = 2; @@ -399,7 +394,7 @@ message SensorList { // SensorSpec represents desired sensor state message SensorSpec { - // EventDependency is a list of the events that this sensor is dependent on. + // Dependencies is a list of the events that this sensor is dependent on. repeated EventDependency dependencies = 1; // Triggers is a list of the things that this sensor evokes. These are the outputs from this sensor. @@ -409,7 +404,7 @@ message SensorSpec { optional k8s.io.api.core.v1.PodSpec deploySpec = 3; // EventProtocol is the protocol through which sensor receives events from gateway - optional EventProtocol dispatchProtocol = 4; + optional EventProtocol eventProtocol = 4; } // SensorStatus contains information about the status of a sensor. @@ -418,11 +413,9 @@ message SensorStatus { optional string phase = 1; // StartedAt is the time at which this sensor was initiated - // +k8s:openapi-gen=false optional k8s.io.apimachinery.pkg.apis.meta.v1.Time startedAt = 2; // CompletedAt is the time at which this sensor was completed - // +k8s:openapi-gen=false optional k8s.io.apimachinery.pkg.apis.meta.v1.Time completedAt = 3; // CompletionCount is the count of sensor's successful runs. diff --git a/pkg/apis/sensor/v1alpha1/openapi_generated.go b/pkg/apis/sensor/v1alpha1/openapi_generated.go index ae24eca86f..edafd08a99 100644 --- a/pkg/apis/sensor/v1alpha1/openapi_generated.go +++ b/pkg/apis/sensor/v1alpha1/openapi_generated.go @@ -319,6 +319,11 @@ func schema_pkg_apis_sensor_v1alpha1_EventContext(ref common.ReferenceCallback) Format: "", }, }, + "eventTime": { + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.MicroTime"), + }, + }, "schemaURL": { SchemaProps: spec.SchemaProps{ Description: "A link to the schema that the data attribute adheres to. Must adhere to the format specified in RFC 3986.", @@ -353,11 +358,11 @@ func schema_pkg_apis_sensor_v1alpha1_EventContext(ref common.ReferenceCallback) }, }, }, - Required: []string{"eventType", "eventTypeVersion", "cloudEventsVersion", "source", "eventID", "schemaURL", "contentType"}, + Required: []string{"eventType", "eventTypeVersion", "cloudEventsVersion", "source", "eventID", "eventTime", "schemaURL", "contentType"}, }, }, Dependencies: []string{ - "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EscalationPolicy", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.URI"}, + "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EscalationPolicy", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.URI", "k8s.io/apimachinery/pkg/apis/meta/v1.MicroTime"}, } } @@ -388,6 +393,13 @@ func schema_pkg_apis_sensor_v1alpha1_EventDependency(ref common.ReferenceCallbac Ref: ref("github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EventDependencyFilter"), }, }, + "connected": { + SchemaProps: spec.SchemaProps{ + Description: "Connected tells if subscription is already setup in case of nats protocol.", + Type: []string{"boolean"}, + Format: "", + }, + }, }, Required: []string{"name"}, }, @@ -675,6 +687,18 @@ func schema_pkg_apis_sensor_v1alpha1_NodeStatus(ref common.ReferenceCallback) co Format: "", }, }, + "startedAt": { + SchemaProps: spec.SchemaProps{ + Description: "StartedAt is the time at which this node started", + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.MicroTime"), + }, + }, + "completedAt": { + SchemaProps: spec.SchemaProps{ + Description: "CompletedAt is the time at which this node completed", + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.MicroTime"), + }, + }, "message": { SchemaProps: spec.SchemaProps{ Description: "store data or something to save for event notifications or trigger events", @@ -693,7 +717,7 @@ func schema_pkg_apis_sensor_v1alpha1_NodeStatus(ref common.ReferenceCallback) co }, }, Dependencies: []string{ - "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.Event"}, + "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.Event", "k8s.io/apimachinery/pkg/apis/meta/v1.MicroTime"}, } } @@ -724,7 +748,7 @@ func schema_pkg_apis_sensor_v1alpha1_ResourceObject(ref common.ReferenceCallback }, "namespace": { SchemaProps: spec.SchemaProps{ - Description: "Namespace in which to create this object optional defaults to the service account namespace", + Description: "Namespace in which to create this object defaults to the service account namespace", Type: []string{"string"}, Format: "", }, @@ -912,10 +936,21 @@ func schema_pkg_apis_sensor_v1alpha1_S3Bucket(ref common.ReferenceCallback) comm Format: "", }, }, + "accessKey": { + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/api/core/v1.SecretKeySelector"), + }, + }, + "secretKey": { + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/api/core/v1.SecretKeySelector"), + }, + }, }, }, }, - Dependencies: []string{}, + Dependencies: []string{ + "k8s.io/api/core/v1.SecretKeySelector"}, } } @@ -953,6 +988,25 @@ func schema_pkg_apis_sensor_v1alpha1_Sensor(ref common.ReferenceCallback) common Description: "Sensor is the definition of a sensor resource", Type: []string{"object"}, Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), + }, + }, "spec": { SchemaProps: spec.SchemaProps{ Ref: ref("github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.SensorSpec"), @@ -964,11 +1018,11 @@ func schema_pkg_apis_sensor_v1alpha1_Sensor(ref common.ReferenceCallback) common }, }, }, - Required: []string{"spec", "status"}, + Required: []string{"metadata", "spec", "status"}, }, }, Dependencies: []string{ - "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.SensorSpec", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.SensorStatus"}, + "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.SensorSpec", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.SensorStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, } } @@ -979,6 +1033,25 @@ func schema_pkg_apis_sensor_v1alpha1_SensorList(ref common.ReferenceCallback) co Description: "SensorList is the list of Sensor resources", Type: []string{"object"}, Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), + }, + }, "items": { SchemaProps: spec.SchemaProps{ Type: []string{"array"}, @@ -992,11 +1065,11 @@ func schema_pkg_apis_sensor_v1alpha1_SensorList(ref common.ReferenceCallback) co }, }, }, - Required: []string{"items"}, + Required: []string{"metadata", "items"}, }, }, Dependencies: []string{ - "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.Sensor"}, + "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.Sensor", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, } } diff --git a/pkg/client/gateway/clientset/versioned/clientset.go b/pkg/client/gateway/clientset/versioned/clientset.go index 8efafc8023..3635c5361f 100644 --- a/pkg/client/gateway/clientset/versioned/clientset.go +++ b/pkg/client/gateway/clientset/versioned/clientset.go @@ -19,6 +19,7 @@ package versioned import ( argoprojv1alpha1 "github.com/argoproj/argo-events/pkg/client/gateway/clientset/versioned/typed/gateway/v1alpha1" + glog "github.com/golang/glog" discovery "k8s.io/client-go/discovery" rest "k8s.io/client-go/rest" flowcontrol "k8s.io/client-go/util/flowcontrol" @@ -72,6 +73,7 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { cs.DiscoveryClient, err = discovery.NewDiscoveryClientForConfig(&configShallowCopy) if err != nil { + glog.Errorf("failed to create the DiscoveryClient: %v", err) return nil, err } return &cs, nil diff --git a/pkg/client/gateway/clientset/versioned/fake/clientset_generated.go b/pkg/client/gateway/clientset/versioned/fake/clientset_generated.go index 34a59f276d..6bb4498314 100644 --- a/pkg/client/gateway/clientset/versioned/fake/clientset_generated.go +++ b/pkg/client/gateway/clientset/versioned/fake/clientset_generated.go @@ -40,10 +40,9 @@ func NewSimpleClientset(objects ...runtime.Object) *Clientset { } } - cs := &Clientset{} - cs.discovery = &fakediscovery.FakeDiscovery{Fake: &cs.Fake} - cs.AddReactor("*", "*", testing.ObjectReaction(o)) - cs.AddWatchReactor("*", func(action testing.Action) (handled bool, ret watch.Interface, err error) { + fakePtr := testing.Fake{} + fakePtr.AddReactor("*", "*", testing.ObjectReaction(o)) + fakePtr.AddWatchReactor("*", func(action testing.Action) (handled bool, ret watch.Interface, err error) { gvr := action.GetResource() ns := action.GetNamespace() watch, err := o.Watch(gvr, ns) @@ -53,7 +52,7 @@ func NewSimpleClientset(objects ...runtime.Object) *Clientset { return true, watch, nil }) - return cs + return &Clientset{fakePtr, &fakediscovery.FakeDiscovery{Fake: &fakePtr}} } // Clientset implements clientset.Interface. Meant to be embedded into a diff --git a/pkg/client/gateway/clientset/versioned/fake/register.go b/pkg/client/gateway/clientset/versioned/fake/register.go index 482cd3ed6c..405334899d 100644 --- a/pkg/client/gateway/clientset/versioned/fake/register.go +++ b/pkg/client/gateway/clientset/versioned/fake/register.go @@ -23,14 +23,15 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" serializer "k8s.io/apimachinery/pkg/runtime/serializer" - utilruntime "k8s.io/apimachinery/pkg/util/runtime" ) var scheme = runtime.NewScheme() var codecs = serializer.NewCodecFactory(scheme) var parameterCodec = runtime.NewParameterCodec(scheme) -var localSchemeBuilder = runtime.SchemeBuilder{ - argoprojv1alpha1.AddToScheme, + +func init() { + v1.AddToGroupVersion(scheme, schema.GroupVersion{Version: "v1"}) + AddToScheme(scheme) } // AddToScheme adds all types of this clientset into the given scheme. This allows composition @@ -43,13 +44,10 @@ var localSchemeBuilder = runtime.SchemeBuilder{ // ) // // kclientset, _ := kubernetes.NewForConfig(c) -// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) +// aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) // // After this, RawExtensions in Kubernetes types will serialize kube-aggregator types // correctly. -var AddToScheme = localSchemeBuilder.AddToScheme - -func init() { - v1.AddToGroupVersion(scheme, schema.GroupVersion{Version: "v1"}) - utilruntime.Must(AddToScheme(scheme)) +func AddToScheme(scheme *runtime.Scheme) { + argoprojv1alpha1.AddToScheme(scheme) } diff --git a/pkg/client/gateway/clientset/versioned/scheme/register.go b/pkg/client/gateway/clientset/versioned/scheme/register.go index c00d416561..e3afa773f0 100644 --- a/pkg/client/gateway/clientset/versioned/scheme/register.go +++ b/pkg/client/gateway/clientset/versioned/scheme/register.go @@ -23,14 +23,15 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" serializer "k8s.io/apimachinery/pkg/runtime/serializer" - utilruntime "k8s.io/apimachinery/pkg/util/runtime" ) var Scheme = runtime.NewScheme() var Codecs = serializer.NewCodecFactory(Scheme) var ParameterCodec = runtime.NewParameterCodec(Scheme) -var localSchemeBuilder = runtime.SchemeBuilder{ - argoprojv1alpha1.AddToScheme, + +func init() { + v1.AddToGroupVersion(Scheme, schema.GroupVersion{Version: "v1"}) + AddToScheme(Scheme) } // AddToScheme adds all types of this clientset into the given scheme. This allows composition @@ -43,13 +44,10 @@ var localSchemeBuilder = runtime.SchemeBuilder{ // ) // // kclientset, _ := kubernetes.NewForConfig(c) -// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) +// aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) // // After this, RawExtensions in Kubernetes types will serialize kube-aggregator types // correctly. -var AddToScheme = localSchemeBuilder.AddToScheme - -func init() { - v1.AddToGroupVersion(Scheme, schema.GroupVersion{Version: "v1"}) - utilruntime.Must(AddToScheme(Scheme)) +func AddToScheme(scheme *runtime.Scheme) { + argoprojv1alpha1.AddToScheme(scheme) } diff --git a/pkg/client/gateway/clientset/versioned/typed/gateway/v1alpha1/fake/fake_gateway.go b/pkg/client/gateway/clientset/versioned/typed/gateway/v1alpha1/fake/fake_gateway.go index 581ec0f080..c76bfc734e 100644 --- a/pkg/client/gateway/clientset/versioned/typed/gateway/v1alpha1/fake/fake_gateway.go +++ b/pkg/client/gateway/clientset/versioned/typed/gateway/v1alpha1/fake/fake_gateway.go @@ -61,7 +61,7 @@ func (c *FakeGateways) List(opts v1.ListOptions) (result *v1alpha1.GatewayList, if label == nil { label = labels.Everything() } - list := &v1alpha1.GatewayList{ListMeta: obj.(*v1alpha1.GatewayList).ListMeta} + list := &v1alpha1.GatewayList{} for _, item := range obj.(*v1alpha1.GatewayList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/pkg/client/gateway/informers/externalversions/factory.go b/pkg/client/gateway/informers/externalversions/factory.go index b1ab6e593a..1c223cc533 100644 --- a/pkg/client/gateway/informers/externalversions/factory.go +++ b/pkg/client/gateway/informers/externalversions/factory.go @@ -31,16 +31,12 @@ import ( cache "k8s.io/client-go/tools/cache" ) -// SharedInformerOption defines the functional option type for SharedInformerFactory. -type SharedInformerOption func(*sharedInformerFactory) *sharedInformerFactory - type sharedInformerFactory struct { client versioned.Interface namespace string tweakListOptions internalinterfaces.TweakListOptionsFunc lock sync.Mutex defaultResync time.Duration - customResync map[reflect.Type]time.Duration informers map[reflect.Type]cache.SharedIndexInformer // startedInformers is used for tracking which informers have been started. @@ -48,62 +44,23 @@ type sharedInformerFactory struct { startedInformers map[reflect.Type]bool } -// WithCustomResyncConfig sets a custom resync period for the specified informer types. -func WithCustomResyncConfig(resyncConfig map[v1.Object]time.Duration) SharedInformerOption { - return func(factory *sharedInformerFactory) *sharedInformerFactory { - for k, v := range resyncConfig { - factory.customResync[reflect.TypeOf(k)] = v - } - return factory - } -} - -// WithTweakListOptions sets a custom filter on all listers of the configured SharedInformerFactory. -func WithTweakListOptions(tweakListOptions internalinterfaces.TweakListOptionsFunc) SharedInformerOption { - return func(factory *sharedInformerFactory) *sharedInformerFactory { - factory.tweakListOptions = tweakListOptions - return factory - } -} - -// WithNamespace limits the SharedInformerFactory to the specified namespace. -func WithNamespace(namespace string) SharedInformerOption { - return func(factory *sharedInformerFactory) *sharedInformerFactory { - factory.namespace = namespace - return factory - } -} - -// NewSharedInformerFactory constructs a new instance of sharedInformerFactory for all namespaces. +// NewSharedInformerFactory constructs a new instance of sharedInformerFactory func NewSharedInformerFactory(client versioned.Interface, defaultResync time.Duration) SharedInformerFactory { - return NewSharedInformerFactoryWithOptions(client, defaultResync) + return NewFilteredSharedInformerFactory(client, defaultResync, v1.NamespaceAll, nil) } // NewFilteredSharedInformerFactory constructs a new instance of sharedInformerFactory. // Listers obtained via this SharedInformerFactory will be subject to the same filters // as specified here. -// Deprecated: Please use NewSharedInformerFactoryWithOptions instead func NewFilteredSharedInformerFactory(client versioned.Interface, defaultResync time.Duration, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) SharedInformerFactory { - return NewSharedInformerFactoryWithOptions(client, defaultResync, WithNamespace(namespace), WithTweakListOptions(tweakListOptions)) -} - -// NewSharedInformerFactoryWithOptions constructs a new instance of a SharedInformerFactory with additional options. -func NewSharedInformerFactoryWithOptions(client versioned.Interface, defaultResync time.Duration, options ...SharedInformerOption) SharedInformerFactory { - factory := &sharedInformerFactory{ + return &sharedInformerFactory{ client: client, - namespace: v1.NamespaceAll, + namespace: namespace, + tweakListOptions: tweakListOptions, defaultResync: defaultResync, informers: make(map[reflect.Type]cache.SharedIndexInformer), startedInformers: make(map[reflect.Type]bool), - customResync: make(map[reflect.Type]time.Duration), - } - - // Apply all options - for _, opt := range options { - factory = opt(factory) } - - return factory } // Start initializes all requested informers. @@ -152,13 +109,7 @@ func (f *sharedInformerFactory) InformerFor(obj runtime.Object, newFunc internal if exists { return informer } - - resyncPeriod, exists := f.customResync[informerType] - if !exists { - resyncPeriod = f.defaultResync - } - - informer = newFunc(f.client, resyncPeriod) + informer = newFunc(f.client, f.defaultResync) f.informers[informerType] = informer return informer diff --git a/pkg/client/sensor/clientset/versioned/clientset.go b/pkg/client/sensor/clientset/versioned/clientset.go index 512c483aaf..83cac1c877 100644 --- a/pkg/client/sensor/clientset/versioned/clientset.go +++ b/pkg/client/sensor/clientset/versioned/clientset.go @@ -19,6 +19,7 @@ package versioned import ( argoprojv1alpha1 "github.com/argoproj/argo-events/pkg/client/sensor/clientset/versioned/typed/sensor/v1alpha1" + glog "github.com/golang/glog" discovery "k8s.io/client-go/discovery" rest "k8s.io/client-go/rest" flowcontrol "k8s.io/client-go/util/flowcontrol" @@ -72,6 +73,7 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { cs.DiscoveryClient, err = discovery.NewDiscoveryClientForConfig(&configShallowCopy) if err != nil { + glog.Errorf("failed to create the DiscoveryClient: %v", err) return nil, err } return &cs, nil diff --git a/pkg/client/sensor/clientset/versioned/fake/clientset_generated.go b/pkg/client/sensor/clientset/versioned/fake/clientset_generated.go index 9f9a6df395..9e0622bbd5 100644 --- a/pkg/client/sensor/clientset/versioned/fake/clientset_generated.go +++ b/pkg/client/sensor/clientset/versioned/fake/clientset_generated.go @@ -40,10 +40,9 @@ func NewSimpleClientset(objects ...runtime.Object) *Clientset { } } - cs := &Clientset{} - cs.discovery = &fakediscovery.FakeDiscovery{Fake: &cs.Fake} - cs.AddReactor("*", "*", testing.ObjectReaction(o)) - cs.AddWatchReactor("*", func(action testing.Action) (handled bool, ret watch.Interface, err error) { + fakePtr := testing.Fake{} + fakePtr.AddReactor("*", "*", testing.ObjectReaction(o)) + fakePtr.AddWatchReactor("*", func(action testing.Action) (handled bool, ret watch.Interface, err error) { gvr := action.GetResource() ns := action.GetNamespace() watch, err := o.Watch(gvr, ns) @@ -53,7 +52,7 @@ func NewSimpleClientset(objects ...runtime.Object) *Clientset { return true, watch, nil }) - return cs + return &Clientset{fakePtr, &fakediscovery.FakeDiscovery{Fake: &fakePtr}} } // Clientset implements clientset.Interface. Meant to be embedded into a diff --git a/pkg/client/sensor/clientset/versioned/fake/register.go b/pkg/client/sensor/clientset/versioned/fake/register.go index 57e50f01da..07fdd02873 100644 --- a/pkg/client/sensor/clientset/versioned/fake/register.go +++ b/pkg/client/sensor/clientset/versioned/fake/register.go @@ -23,14 +23,15 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" serializer "k8s.io/apimachinery/pkg/runtime/serializer" - utilruntime "k8s.io/apimachinery/pkg/util/runtime" ) var scheme = runtime.NewScheme() var codecs = serializer.NewCodecFactory(scheme) var parameterCodec = runtime.NewParameterCodec(scheme) -var localSchemeBuilder = runtime.SchemeBuilder{ - argoprojv1alpha1.AddToScheme, + +func init() { + v1.AddToGroupVersion(scheme, schema.GroupVersion{Version: "v1"}) + AddToScheme(scheme) } // AddToScheme adds all types of this clientset into the given scheme. This allows composition @@ -43,13 +44,10 @@ var localSchemeBuilder = runtime.SchemeBuilder{ // ) // // kclientset, _ := kubernetes.NewForConfig(c) -// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) +// aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) // // After this, RawExtensions in Kubernetes types will serialize kube-aggregator types // correctly. -var AddToScheme = localSchemeBuilder.AddToScheme - -func init() { - v1.AddToGroupVersion(scheme, schema.GroupVersion{Version: "v1"}) - utilruntime.Must(AddToScheme(scheme)) +func AddToScheme(scheme *runtime.Scheme) { + argoprojv1alpha1.AddToScheme(scheme) } diff --git a/pkg/client/sensor/clientset/versioned/scheme/register.go b/pkg/client/sensor/clientset/versioned/scheme/register.go index f73b48c8c0..295906a212 100644 --- a/pkg/client/sensor/clientset/versioned/scheme/register.go +++ b/pkg/client/sensor/clientset/versioned/scheme/register.go @@ -23,14 +23,15 @@ import ( runtime "k8s.io/apimachinery/pkg/runtime" schema "k8s.io/apimachinery/pkg/runtime/schema" serializer "k8s.io/apimachinery/pkg/runtime/serializer" - utilruntime "k8s.io/apimachinery/pkg/util/runtime" ) var Scheme = runtime.NewScheme() var Codecs = serializer.NewCodecFactory(Scheme) var ParameterCodec = runtime.NewParameterCodec(Scheme) -var localSchemeBuilder = runtime.SchemeBuilder{ - argoprojv1alpha1.AddToScheme, + +func init() { + v1.AddToGroupVersion(Scheme, schema.GroupVersion{Version: "v1"}) + AddToScheme(Scheme) } // AddToScheme adds all types of this clientset into the given scheme. This allows composition @@ -43,13 +44,10 @@ var localSchemeBuilder = runtime.SchemeBuilder{ // ) // // kclientset, _ := kubernetes.NewForConfig(c) -// _ = aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) +// aggregatorclientsetscheme.AddToScheme(clientsetscheme.Scheme) // // After this, RawExtensions in Kubernetes types will serialize kube-aggregator types // correctly. -var AddToScheme = localSchemeBuilder.AddToScheme - -func init() { - v1.AddToGroupVersion(Scheme, schema.GroupVersion{Version: "v1"}) - utilruntime.Must(AddToScheme(Scheme)) +func AddToScheme(scheme *runtime.Scheme) { + argoprojv1alpha1.AddToScheme(scheme) } diff --git a/pkg/client/sensor/clientset/versioned/typed/sensor/v1alpha1/fake/fake_sensor.go b/pkg/client/sensor/clientset/versioned/typed/sensor/v1alpha1/fake/fake_sensor.go index 6838f87597..f8529c3649 100644 --- a/pkg/client/sensor/clientset/versioned/typed/sensor/v1alpha1/fake/fake_sensor.go +++ b/pkg/client/sensor/clientset/versioned/typed/sensor/v1alpha1/fake/fake_sensor.go @@ -61,7 +61,7 @@ func (c *FakeSensors) List(opts v1.ListOptions) (result *v1alpha1.SensorList, er if label == nil { label = labels.Everything() } - list := &v1alpha1.SensorList{ListMeta: obj.(*v1alpha1.SensorList).ListMeta} + list := &v1alpha1.SensorList{} for _, item := range obj.(*v1alpha1.SensorList).Items { if label.Matches(labels.Set(item.Labels)) { list.Items = append(list.Items, item) diff --git a/pkg/client/sensor/informers/externalversions/factory.go b/pkg/client/sensor/informers/externalversions/factory.go index 32c44340f6..229d8f3b86 100644 --- a/pkg/client/sensor/informers/externalversions/factory.go +++ b/pkg/client/sensor/informers/externalversions/factory.go @@ -31,16 +31,12 @@ import ( cache "k8s.io/client-go/tools/cache" ) -// SharedInformerOption defines the functional option type for SharedInformerFactory. -type SharedInformerOption func(*sharedInformerFactory) *sharedInformerFactory - type sharedInformerFactory struct { client versioned.Interface namespace string tweakListOptions internalinterfaces.TweakListOptionsFunc lock sync.Mutex defaultResync time.Duration - customResync map[reflect.Type]time.Duration informers map[reflect.Type]cache.SharedIndexInformer // startedInformers is used for tracking which informers have been started. @@ -48,62 +44,23 @@ type sharedInformerFactory struct { startedInformers map[reflect.Type]bool } -// WithCustomResyncConfig sets a custom resync period for the specified informer types. -func WithCustomResyncConfig(resyncConfig map[v1.Object]time.Duration) SharedInformerOption { - return func(factory *sharedInformerFactory) *sharedInformerFactory { - for k, v := range resyncConfig { - factory.customResync[reflect.TypeOf(k)] = v - } - return factory - } -} - -// WithTweakListOptions sets a custom filter on all listers of the configured SharedInformerFactory. -func WithTweakListOptions(tweakListOptions internalinterfaces.TweakListOptionsFunc) SharedInformerOption { - return func(factory *sharedInformerFactory) *sharedInformerFactory { - factory.tweakListOptions = tweakListOptions - return factory - } -} - -// WithNamespace limits the SharedInformerFactory to the specified namespace. -func WithNamespace(namespace string) SharedInformerOption { - return func(factory *sharedInformerFactory) *sharedInformerFactory { - factory.namespace = namespace - return factory - } -} - -// NewSharedInformerFactory constructs a new instance of sharedInformerFactory for all namespaces. +// NewSharedInformerFactory constructs a new instance of sharedInformerFactory func NewSharedInformerFactory(client versioned.Interface, defaultResync time.Duration) SharedInformerFactory { - return NewSharedInformerFactoryWithOptions(client, defaultResync) + return NewFilteredSharedInformerFactory(client, defaultResync, v1.NamespaceAll, nil) } // NewFilteredSharedInformerFactory constructs a new instance of sharedInformerFactory. // Listers obtained via this SharedInformerFactory will be subject to the same filters // as specified here. -// Deprecated: Please use NewSharedInformerFactoryWithOptions instead func NewFilteredSharedInformerFactory(client versioned.Interface, defaultResync time.Duration, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) SharedInformerFactory { - return NewSharedInformerFactoryWithOptions(client, defaultResync, WithNamespace(namespace), WithTweakListOptions(tweakListOptions)) -} - -// NewSharedInformerFactoryWithOptions constructs a new instance of a SharedInformerFactory with additional options. -func NewSharedInformerFactoryWithOptions(client versioned.Interface, defaultResync time.Duration, options ...SharedInformerOption) SharedInformerFactory { - factory := &sharedInformerFactory{ + return &sharedInformerFactory{ client: client, - namespace: v1.NamespaceAll, + namespace: namespace, + tweakListOptions: tweakListOptions, defaultResync: defaultResync, informers: make(map[reflect.Type]cache.SharedIndexInformer), startedInformers: make(map[reflect.Type]bool), - customResync: make(map[reflect.Type]time.Duration), - } - - // Apply all options - for _, opt := range options { - factory = opt(factory) } - - return factory } // Start initializes all requested informers. @@ -152,13 +109,7 @@ func (f *sharedInformerFactory) InformerFor(obj runtime.Object, newFunc internal if exists { return informer } - - resyncPeriod, exists := f.customResync[informerType] - if !exists { - resyncPeriod = f.defaultResync - } - - informer = newFunc(f.client, resyncPeriod) + informer = newFunc(f.client, f.defaultResync) f.informers[informerType] = informer return informer diff --git a/sensors/cmd/Dockerfile b/sensors/cmd/Dockerfile index 6f29ee24d9..bf2f29a563 100644 --- a/sensors/cmd/Dockerfile +++ b/sensors/cmd/Dockerfile @@ -1,3 +1,3 @@ FROM centos:7 -COPY dist/sn /bin/ -ENTRYPOINT [ "/bin/sn" ] \ No newline at end of file +COPY dist/sensor /bin/ +ENTRYPOINT [ "/bin/sensor" ] \ No newline at end of file diff --git a/sensors/http-events-handler.go b/sensors/http-events-handler.go index c6bc60ce61..d492c26dcb 100644 --- a/sensors/http-events-handler.go +++ b/sensors/http-events-handler.go @@ -28,12 +28,12 @@ import ( // HttpEventProtocol handles events sent over HTTP func (sec *sensorExecutionCtx) HttpEventProtocol() { // create a http server. this server listens for events from gateway. - sec.server = &http.Server{Addr: fmt.Sprintf(":%s", common.SensorServicePort)} + sec.server = &http.Server{Addr: fmt.Sprintf(":%s", sec.sensor.Spec.EventProtocol.Http.Port)} // add a handler to handle incoming events http.HandleFunc("/", sec.httpEventHandler) - sec.log.Info().Str("port", string(common.SensorServicePort)).Msg("sensor started listening") + sec.log.Info().Str("port", sec.sensor.Spec.EventProtocol.Http.Port).Msg("sensor started listening") if err := sec.server.ListenAndServe(); err != nil { sec.log.Error().Err(err).Msg("sensor server stopped") // escalate error diff --git a/sensors/nats-events-handler.go b/sensors/nats-events-handler.go index 9b973089a8..f742a11eab 100644 --- a/sensors/nats-events-handler.go +++ b/sensors/nats-events-handler.go @@ -19,6 +19,7 @@ package sensors import ( "github.com/argoproj/argo-events/pkg/apis/sensor" "strconv" + "strings" "time" "github.com/argoproj/argo-events/common" @@ -35,7 +36,9 @@ func (sec *sensorExecutionCtx) successNatsConnection() { } if err := common.GenerateK8sEvent(sec.kubeClient, "connection setup successfully", common.OperationSuccessEventType, "connection setup", sec.sensor.Name, sec.sensor.Namespace, sec.controllerInstanceID, sensor.Kind, labels); err != nil { sec.log.Error().Err(err).Msg("failed to create K8s event to log nats connection setup success") + return } + sec.log.Info().Msg("created event for nats connection setup success") } func (sec *sensorExecutionCtx) escalateNatsConnectionFailure() { @@ -47,19 +50,23 @@ func (sec *sensorExecutionCtx) escalateNatsConnectionFailure() { } if err := common.GenerateK8sEvent(sec.kubeClient, "connection setup failed", common.EscalationEventType, "connection setup", sec.sensor.Name, sec.sensor.Namespace, sec.controllerInstanceID, sensor.Kind, labels); err != nil { sec.log.Error().Err(err).Msg("failed to create K8s event to log nats connection setup error") + return } + sec.log.Warn().Msg("created event for nats connection failure") } func (sec *sensorExecutionCtx) successNatsSubscription(eventSource string) { labels := map[string]string{ common.LabelEventType: string(common.OperationSuccessEventType), common.LabelSensorName: sec.sensor.Name, - common.LabelEventSource: eventSource, + common.LabelEventSource: strings.Replace(eventSource, "/", "_", -1), common.LabelOperation: "nats_subscription_success", } if err := common.GenerateK8sEvent(sec.kubeClient, "nats subscription success", common.OperationSuccessEventType, "subscription setup", sec.sensor.Name, sec.sensor.Namespace, sec.controllerInstanceID, sensor.Kind, labels); err != nil { sec.log.Error().Err(err).Msg("failed to create K8s event to log nats subscription success") + return } + sec.log.Info().Str("event-source", eventSource).Msg("created event for nats subscription success ") } func (sec *sensorExecutionCtx) escalateNatsSubscriptionFailure(eventSource string) { @@ -67,12 +74,14 @@ func (sec *sensorExecutionCtx) escalateNatsSubscriptionFailure(eventSource strin labels := map[string]string{ common.LabelEventType: string(common.OperationFailureEventType), common.LabelSensorName: sec.sensor.Name, - common.LabelEventSource: eventSource, + common.LabelEventSource: strings.Replace(eventSource, "/", "_", -1), common.LabelOperation: "nats_subscription_failure", } if err := common.GenerateK8sEvent(sec.kubeClient, "nats subscription failed", common.OperationFailureEventType, "subscription setup", sec.sensor.Name, sec.sensor.Namespace, sec.controllerInstanceID, sensor.Kind, labels); err != nil { sec.log.Error().Err(err).Msg("failed to create K8s event to log nats subscription error") + return } + sec.log.Warn().Str("event-source", eventSource).Msg("created event for nats subscription failure") } // NatsEventProtocol handles events sent over NATS @@ -88,9 +97,11 @@ func (sec *sensorExecutionCtx) NatsEventProtocol() { if sec.nconn.standard == nil { sec.nconn.standard, err = nats.Connect(sec.sensor.Spec.EventProtocol.Nats.URL) if err != nil { + // escalate failure sec.escalateNatsConnectionFailure() sec.log.Panic().Err(err).Msg("failed to connect to nats server") } + // log success sec.successNatsConnection() } for _, dependency := range sec.sensor.Spec.Dependencies { @@ -98,11 +109,13 @@ func (sec *sensorExecutionCtx) NatsEventProtocol() { continue } if _, err := sec.getNatsStandardSubscription(dependency.Name); err != nil { + // escalate failure sec.escalateNatsSubscriptionFailure(dependency.Name) sec.log.Error().Err(err).Str("event-source-name", dependency.Name).Msg("failed to get the nats subscription") continue } dependency.Connected = true + // log success sec.successNatsSubscription(dependency.Name) } From ebcae7da45a31087b807db8a1d229e600d88055c Mon Sep 17 00:00:00 2001 From: vpage Date: Tue, 22 Jan 2019 16:12:22 -0500 Subject: [PATCH 09/22] Fixing nats-streaming issue --- Makefile | 6 +- common/common.go | 18 + common/util.go | 2 +- controllers/gateway/validate.go | 20 +- controllers/sensor/operator.go | 2 +- controllers/sensor/validate.go | 10 +- gateways/config.go | 30 +- gateways/transformer.go | 22 +- pkg/apis/gateway/v1alpha1/generated.pb.go | 305 ++++-- pkg/apis/gateway/v1alpha1/generated.proto | 7 + .../gateway/v1alpha1/openapi_generated.go | 20 +- pkg/apis/gateway/v1alpha1/types.go | 20 +- .../gateway/v1alpha1/zz_generated.deepcopy.go | 2 +- pkg/apis/sensor/v1alpha1/generated.pb.go | 943 +++++------------- pkg/apis/sensor/v1alpha1/generated.proto | 27 - pkg/apis/sensor/v1alpha1/openapi_generated.go | 69 +- pkg/apis/sensor/v1alpha1/types.go | 63 +- .../sensor/v1alpha1/zz_generated.deepcopy.go | 40 +- sensors/event-handler.go | 4 +- sensors/event-handler_test.go | 14 +- sensors/nats-events-handler.go | 9 +- sensors/signal-filter_test.go | 5 - 22 files changed, 611 insertions(+), 1027 deletions(-) diff --git a/Makefile b/Makefile index 1aced5d3f2..24aad1ba32 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ override LDFLAGS += \ # docker image publishing options DOCKER_PUSH=true IMAGE_NAMESPACE=argoproj -IMAGE_TAG=v0.6.1 +IMAGE_TAG=v0.6.3 ifeq (${DOCKER_PUSH},true) ifndef IMAGE_NAMESPACE @@ -35,9 +35,9 @@ endif # Build the project images .DELETE_ON_ERROR: -all: sensor-linux sensor-controller-linux gateway-controller-linux gateway-client-linux webhook-linux calendar-linux resource-linux artifact-linux file-linux nats-linux kafka-linux amqp-linux mqtt-linux storage-grid-linux +all: sensor-linux sensor-controller-linux gateway-controller-linux gateway-client-linux webhook-linux calendar-linux resource-linux artifact-linux file-linux nats-linux kafka-linux amqp-linux mqtt-linux storage-grid-linux github-linux -all-images: sensor-image sensor-controller-image gateway-controller-image gateway-client-image webhook-image calendar-image resource-image artifact-image file-image nats-image kafka-image amqp-image mqtt-image storage-grid-image +all-images: sensor-image sensor-controller-image gateway-controller-image gateway-client-image webhook-image calendar-image resource-image artifact-image file-image nats-image kafka-image amqp-image mqtt-image storage-grid-image github-image all-controller-images: sensor-controller-image gateway-controller-image diff --git a/common/common.go b/common/common.go index de3f91d55f..b17e2507ab 100644 --- a/common/common.go +++ b/common/common.go @@ -21,6 +21,24 @@ import ( "github.com/argoproj/argo-events/pkg/apis/sensor" ) +// EventProtocolType is type of the event dispatch protocol. Used for dispatching events +type EventProtocolType string + +// possible types of event dispatch protocol +const ( + HTTP EventProtocolType = "HTTP" + NATS EventProtocolType = "NATS" +) + +// Type of nats connection. +type NatsType string + +// possible values of nats connection type +const ( + Standard NatsType = "Standard" + Streaming NatsType = "Streaming" +) + const ( // EnvVarKubeConfig is the path to the Kubernetes configuration EnvVarKubeConfig = "KUBE_CONFIG" diff --git a/common/util.go b/common/util.go index 4d9aba4140..e430c86a6e 100644 --- a/common/util.go +++ b/common/util.go @@ -44,7 +44,7 @@ func DefaultServiceName(serviceName string) string { // DefaultGatewayConfigurationName returns a formulated name for a gateway configuration func DefaultGatewayConfigurationName(gatewayName string, configurationName string) string { - return fmt.Sprintf("%s/%s", gatewayName, configurationName) + return fmt.Sprintf("%s:%s", gatewayName, configurationName) } // DefaultNatsQueueName returns a queue name for nats subject diff --git a/controllers/gateway/validate.go b/controllers/gateway/validate.go index 6573048081..001b703ded 100644 --- a/controllers/gateway/validate.go +++ b/controllers/gateway/validate.go @@ -18,6 +18,7 @@ package gateway import ( "fmt" + "github.com/argoproj/argo-events/common" "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1" ) @@ -33,18 +34,27 @@ func Validate(gw *v1alpha1.Gateway) error { if gw.Spec.EventVersion == "" { return fmt.Errorf("gateway version is not specified") } - switch gw.Spec.DispatchProtocol.Type { - case v1alpha1.HTTPGateway: + switch gw.Spec.EventProtocol.Type { + case common.HTTP: if gw.Spec.Watchers == nil || (gw.Spec.Watchers.Gateways == nil && gw.Spec.Watchers.Sensors == nil) { return fmt.Errorf("no associated watchers with gateway") } - if gw.Spec.DispatchProtocol.Http.Port == "" { + if gw.Spec.EventProtocol.Http.Port == "" { return fmt.Errorf("http server port is not defined") } - case v1alpha1.NATSGateway: - if gw.Spec.DispatchProtocol.Nats.URL == "" { + case common.NATS: + if gw.Spec.EventProtocol.Nats.URL == "" { return fmt.Errorf("nats url is not defined") } + if gw.Spec.EventProtocol.Nats.Type == "" { + return fmt.Errorf("nats service type is not defined") + } + if gw.Spec.EventProtocol.Nats.Type == common.Streaming && gw.Spec.EventProtocol.Nats.ClientId == "" { + return fmt.Errorf("client id must be specified when using nats streaming") + } + if gw.Spec.EventProtocol.Nats.Type == common.Streaming && gw.Spec.EventProtocol.Nats.ClusterId == "" { + return fmt.Errorf("cluster id must be specified when using nats streaming") + } default: return fmt.Errorf("unknown gateway type") } diff --git a/controllers/sensor/operator.go b/controllers/sensor/operator.go index 3ade020882..c16ecc4994 100644 --- a/controllers/sensor/operator.go +++ b/controllers/sensor/operator.go @@ -153,7 +153,7 @@ func (soc *sOperationCtx) operate() error { soc.log.Info().Msg("sensor pod created") // Create a ClusterIP service to expose sensor in cluster if the event protocol type is HTTP - if _, err = soc.controller.kubeClientset.CoreV1().Services(soc.s.Namespace).Get(common.DefaultServiceName(soc.s.Name), metav1.GetOptions{}); err != nil && apierr.IsNotFound(err) && soc.s.Spec.EventProtocol.Type == v1alpha1.HTTP { + if _, err = soc.controller.kubeClientset.CoreV1().Services(soc.s.Namespace).Get(common.DefaultServiceName(soc.s.Name), metav1.GetOptions{}); err != nil && apierr.IsNotFound(err) && soc.s.Spec.EventProtocol.Type == common.HTTP { // Create sensor service sensorSvc := &corev1.Service{ ObjectMeta: metav1.ObjectMeta{ diff --git a/controllers/sensor/validate.go b/controllers/sensor/validate.go index 1b44d0687e..459311e23e 100644 --- a/controllers/sensor/validate.go +++ b/controllers/sensor/validate.go @@ -40,17 +40,23 @@ func ValidateSensor(s *v1alpha1.Sensor) error { return fmt.Errorf("sensor pod specification can't have more than one container") } switch s.Spec.EventProtocol.Type { - case v1alpha1.HTTP: + case common.HTTP: if s.Spec.EventProtocol.Http.Port == "" { return fmt.Errorf("http server port is not defined") } - case v1alpha1.NATS: + case common.NATS: if s.Spec.EventProtocol.Nats.URL == "" { return fmt.Errorf("nats url is not defined") } if s.Spec.EventProtocol.Nats.Type == "" { return fmt.Errorf("nats type is not defined. either Standard or Streaming type should be defined") } + if s.Spec.EventProtocol.Nats.Type == common.Streaming && s.Spec.EventProtocol.Nats.ClientId == "" { + return fmt.Errorf("client id must be specified when using nats streaming") + } + if s.Spec.EventProtocol.Nats.Type == common.Streaming && s.Spec.EventProtocol.Nats.ClusterId == "" { + return fmt.Errorf("cluster id must be specified when using nats streaming") + } default: return fmt.Errorf("unknown gateway type") } diff --git a/gateways/config.go b/gateways/config.go index 400bdbe0a1..0715f511a9 100644 --- a/gateways/config.go +++ b/gateways/config.go @@ -19,12 +19,14 @@ package gateways import ( "context" "fmt" - "github.com/nats-io/go-nats" "os" + "github.com/nats-io/go-nats" + "github.com/argoproj/argo-events/common" "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1" gwclientset "github.com/argoproj/argo-events/pkg/client/gateway/clientset/versioned" + snats "github.com/nats-io/go-nats-streaming" "github.com/rs/zerolog" "google.golang.org/grpc" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -60,8 +62,10 @@ type GatewayConfig struct { controllerInstanceID string // StatusCh is used to communicate the status of an event source StatusCh chan EventSourceStatus - // natsConn is the nast client used to publish events to cluster. Only used if dispatch protocol is NATS + // natsConn is the standard nats connection used to publish events to cluster. Only used if dispatch protocol is NATS natsConn *nats.Conn + // natsStreamingConn is the nats connection used for streaming. + natsStreamingConn snats.Conn // sensorHttpPort is the http server running in sensor that listens to event. Only used if dispatch protocol is HTTP sensorHttpPort string } @@ -148,14 +152,22 @@ func NewGatewayConfiguration() *GatewayConfig { StatusCh: make(chan EventSourceStatus), } - switch gw.Spec.DispatchProtocol.Type { - case v1alpha1.HTTPGateway: - gc.sensorHttpPort = gw.Spec.DispatchProtocol.Http.Port - case v1alpha1.NATSGateway: - if gc.natsConn, err = nats.Connect(gw.Spec.DispatchProtocol.Nats.URL); err != nil { - panic(fmt.Errorf("failed to connect to NATS cluster. err: %+v", err)) + switch gw.Spec.EventProtocol.Type { + case common.HTTP: + gc.sensorHttpPort = gw.Spec.EventProtocol.Http.Port + case common.NATS: + if gc.natsConn, err = nats.Connect(gw.Spec.EventProtocol.Nats.URL); err != nil { + panic(fmt.Errorf("failed to obtain NATS standard connection. err: %+v", err)) + } + gc.Log.Info().Str("nats-url", gw.Spec.EventProtocol.Nats.URL).Msg("connected to nats service") + + if gc.gw.Spec.EventProtocol.Nats.Type == common.Streaming { + gc.natsStreamingConn, err = snats.Connect(gc.gw.Spec.EventProtocol.Nats.ClusterId, gc.gw.Spec.EventProtocol.Nats.ClientId, snats.NatsConn(gc.natsConn)) + if err != nil { + panic(fmt.Errorf("failed to obtain NATS streaming connection. err: %+v", err)) + } + gc.Log.Info().Str("nats-url", gw.Spec.EventProtocol.Nats.URL).Msg("nats streaming connection successful") } - gc.Log.Info().Str("nats-url", gw.Spec.DispatchProtocol.Nats.URL).Msg("connected to nats") } return gc } diff --git a/gateways/transformer.go b/gateways/transformer.go index 5c186f3ed8..f5e5ef1e23 100644 --- a/gateways/transformer.go +++ b/gateways/transformer.go @@ -20,7 +20,6 @@ import ( "bytes" "encoding/json" "fmt" - "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1" "net/http" "time" @@ -50,17 +49,17 @@ func (gc *GatewayConfig) DispatchEvent(gatewayEvent *Event) error { return fmt.Errorf("failed to dispatch event to watchers over http. marshalling failed. err: %+v", err) } - switch gc.gw.Spec.DispatchProtocol.Type { - case v1alpha1.HTTPGateway: + switch gc.gw.Spec.EventProtocol.Type { + case common.HTTP: if err = gc.dispatchEventOverHttp(transformedEvent.Context.Source.Host, payload); err != nil { return err } - case v1alpha1.NATSGateway: + case common.NATS: if err = gc.dispatchEventOverNats(transformedEvent.Context.Source.Host, payload); err != nil { return err } default: - return fmt.Errorf("unknown dispatch mechanism %s", gc.gw.Spec.DispatchProtocol) + return fmt.Errorf("unknown dispatch mechanism %s", gc.gw.Spec.EventProtocol) } return nil } @@ -99,7 +98,7 @@ func (gc *GatewayConfig) dispatchEventOverHttp(source string, eventPayload []byt gc.Log.Info().Str("source", source).Msg("dispatching event to watchers") for _, sensor := range gc.gw.Spec.Watchers.Sensors { - if err := gc.postCloudEventToWatcher(common.DefaultServiceName(sensor.Name), gc.gw.Spec.DispatchProtocol.Http.Port, common.SensorServiceEndpoint, eventPayload); err != nil { + if err := gc.postCloudEventToWatcher(common.DefaultServiceName(sensor.Name), gc.gw.Spec.EventProtocol.Http.Port, common.SensorServiceEndpoint, eventPayload); err != nil { return fmt.Errorf("failed to dispatch event to sensor watcher over http. communication error. err: %+v", err) } } @@ -114,7 +113,16 @@ func (gc *GatewayConfig) dispatchEventOverHttp(source string, eventPayload []byt // dispatchEventOverNats dispatches event over nats func (gc *GatewayConfig) dispatchEventOverNats(source string, eventPayload []byte) error { - if err := gc.natsConn.Publish(source, eventPayload); err != nil { + var err error + + switch gc.gw.Spec.EventProtocol.Nats.Type { + case common.Standard: + err = gc.natsConn.Publish(source, eventPayload) + case common.Streaming: + err = gc.natsStreamingConn.Publish(source, eventPayload) + } + + if err != nil { gc.Log.Error().Err(err).Str("source", source).Msg("failed to publish event") return err } diff --git a/pkg/apis/gateway/v1alpha1/generated.pb.go b/pkg/apis/gateway/v1alpha1/generated.pb.go index e10beeb044..115d94ab55 100644 --- a/pkg/apis/gateway/v1alpha1/generated.pb.go +++ b/pkg/apis/gateway/v1alpha1/generated.pb.go @@ -23,6 +23,8 @@ import math "math" import v11 "k8s.io/api/core/v1" +import github_com_argoproj_argo_events_common "github.com/argoproj/argo-events/common" + import github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys" import strings "strings" @@ -44,7 +46,7 @@ const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package func (m *DispatchProtocol) Reset() { *m = DispatchProtocol{} } func (*DispatchProtocol) ProtoMessage() {} func (*DispatchProtocol) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_a2bfb65c2618fd75, []int{0} + return fileDescriptor_generated_80114384d8f9498c, []int{0} } func (m *DispatchProtocol) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -72,7 +74,7 @@ var xxx_messageInfo_DispatchProtocol proto.InternalMessageInfo func (m *Gateway) Reset() { *m = Gateway{} } func (*Gateway) ProtoMessage() {} func (*Gateway) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_a2bfb65c2618fd75, []int{1} + return fileDescriptor_generated_80114384d8f9498c, []int{1} } func (m *Gateway) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -100,7 +102,7 @@ var xxx_messageInfo_Gateway proto.InternalMessageInfo func (m *GatewayList) Reset() { *m = GatewayList{} } func (*GatewayList) ProtoMessage() {} func (*GatewayList) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_a2bfb65c2618fd75, []int{2} + return fileDescriptor_generated_80114384d8f9498c, []int{2} } func (m *GatewayList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -128,7 +130,7 @@ var xxx_messageInfo_GatewayList proto.InternalMessageInfo func (m *GatewayNotificationWatcher) Reset() { *m = GatewayNotificationWatcher{} } func (*GatewayNotificationWatcher) ProtoMessage() {} func (*GatewayNotificationWatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_a2bfb65c2618fd75, []int{3} + return fileDescriptor_generated_80114384d8f9498c, []int{3} } func (m *GatewayNotificationWatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -156,7 +158,7 @@ var xxx_messageInfo_GatewayNotificationWatcher proto.InternalMessageInfo func (m *GatewaySpec) Reset() { *m = GatewaySpec{} } func (*GatewaySpec) ProtoMessage() {} func (*GatewaySpec) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_a2bfb65c2618fd75, []int{4} + return fileDescriptor_generated_80114384d8f9498c, []int{4} } func (m *GatewaySpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -184,7 +186,7 @@ var xxx_messageInfo_GatewaySpec proto.InternalMessageInfo func (m *GatewayStatus) Reset() { *m = GatewayStatus{} } func (*GatewayStatus) ProtoMessage() {} func (*GatewayStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_a2bfb65c2618fd75, []int{5} + return fileDescriptor_generated_80114384d8f9498c, []int{5} } func (m *GatewayStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -212,7 +214,7 @@ var xxx_messageInfo_GatewayStatus proto.InternalMessageInfo func (m *Http) Reset() { *m = Http{} } func (*Http) ProtoMessage() {} func (*Http) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_a2bfb65c2618fd75, []int{6} + return fileDescriptor_generated_80114384d8f9498c, []int{6} } func (m *Http) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -240,7 +242,7 @@ var xxx_messageInfo_Http proto.InternalMessageInfo func (m *Nats) Reset() { *m = Nats{} } func (*Nats) ProtoMessage() {} func (*Nats) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_a2bfb65c2618fd75, []int{7} + return fileDescriptor_generated_80114384d8f9498c, []int{7} } func (m *Nats) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -268,7 +270,7 @@ var xxx_messageInfo_Nats proto.InternalMessageInfo func (m *NodeStatus) Reset() { *m = NodeStatus{} } func (*NodeStatus) ProtoMessage() {} func (*NodeStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_a2bfb65c2618fd75, []int{8} + return fileDescriptor_generated_80114384d8f9498c, []int{8} } func (m *NodeStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -296,7 +298,7 @@ var xxx_messageInfo_NodeStatus proto.InternalMessageInfo func (m *NotificationWatchers) Reset() { *m = NotificationWatchers{} } func (*NotificationWatchers) ProtoMessage() {} func (*NotificationWatchers) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_a2bfb65c2618fd75, []int{9} + return fileDescriptor_generated_80114384d8f9498c, []int{9} } func (m *NotificationWatchers) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -324,7 +326,7 @@ var xxx_messageInfo_NotificationWatchers proto.InternalMessageInfo func (m *SensorNotificationWatcher) Reset() { *m = SensorNotificationWatcher{} } func (*SensorNotificationWatcher) ProtoMessage() {} func (*SensorNotificationWatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_a2bfb65c2618fd75, []int{10} + return fileDescriptor_generated_80114384d8f9498c, []int{10} } func (m *SensorNotificationWatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -574,8 +576,8 @@ func (m *GatewaySpec) MarshalTo(dAtA []byte) (int, error) { i += copy(dAtA[i:], m.ProcessorPort) dAtA[i] = 0x42 i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.DispatchProtocol.Size())) - n10, err := m.DispatchProtocol.MarshalTo(dAtA[i:]) + i = encodeVarintGenerated(dAtA, i, uint64(m.EventProtocol.Size())) + n10, err := m.EventProtocol.MarshalTo(dAtA[i:]) if err != nil { return 0, err } @@ -689,6 +691,18 @@ func (m *Nats) MarshalTo(dAtA []byte) (int, error) { i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.URL))) i += copy(dAtA[i:], m.URL) + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Type))) + i += copy(dAtA[i:], m.Type) + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ClientId))) + i += copy(dAtA[i:], m.ClientId) + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ClusterId))) + i += copy(dAtA[i:], m.ClusterId) return i, nil } @@ -907,7 +921,7 @@ func (m *GatewaySpec) Size() (n int) { } l = len(m.ProcessorPort) n += 1 + l + sovGenerated(uint64(l)) - l = m.DispatchProtocol.Size() + l = m.EventProtocol.Size() n += 1 + l + sovGenerated(uint64(l)) return n } @@ -955,6 +969,12 @@ func (m *Nats) Size() (n int) { _ = l l = len(m.URL) n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Type) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.ClientId) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.ClusterId) + n += 1 + l + sovGenerated(uint64(l)) return n } @@ -1085,7 +1105,7 @@ func (this *GatewaySpec) String() string { `ServiceSpec:` + strings.Replace(fmt.Sprintf("%v", this.ServiceSpec), "Service", "v11.Service", 1) + `,`, `Watchers:` + strings.Replace(fmt.Sprintf("%v", this.Watchers), "NotificationWatchers", "NotificationWatchers", 1) + `,`, `ProcessorPort:` + fmt.Sprintf("%v", this.ProcessorPort) + `,`, - `DispatchProtocol:` + strings.Replace(strings.Replace(this.DispatchProtocol.String(), "DispatchProtocol", "DispatchProtocol", 1), `&`, ``, 1) + `,`, + `EventProtocol:` + strings.Replace(strings.Replace(this.EventProtocol.String(), "DispatchProtocol", "DispatchProtocol", 1), `&`, ``, 1) + `,`, `}`, }, "") return s @@ -1129,6 +1149,9 @@ func (this *Nats) String() string { } s := strings.Join([]string{`&Nats{`, `URL:` + fmt.Sprintf("%v", this.URL) + `,`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `ClientId:` + fmt.Sprintf("%v", this.ClientId) + `,`, + `ClusterId:` + fmt.Sprintf("%v", this.ClusterId) + `,`, `}`, }, "") return s @@ -1234,7 +1257,7 @@ func (m *DispatchProtocol) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Type = DispatchProtocolType(dAtA[iNdEx:postIndex]) + m.Type = github_com_argoproj_argo_events_common.EventProtocolType(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { @@ -1951,7 +1974,7 @@ func (m *GatewaySpec) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 8: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DispatchProtocol", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field EventProtocol", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -1975,7 +1998,7 @@ func (m *GatewaySpec) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.DispatchProtocol.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.EventProtocol.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -2398,6 +2421,93 @@ func (m *Nats) Unmarshal(dAtA []byte) error { } m.URL = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Type = github_com_argoproj_argo_events_common.NatsType(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClientId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClientId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClusterId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClusterId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -2971,81 +3081,86 @@ var ( ) func init() { - proto.RegisterFile("github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1/generated.proto", fileDescriptor_generated_a2bfb65c2618fd75) -} - -var fileDescriptor_generated_a2bfb65c2618fd75 = []byte{ - // 1152 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0xcf, 0x6f, 0x1b, 0xc5, - 0x17, 0xcf, 0xfa, 0x47, 0x6c, 0x8f, 0x93, 0x36, 0xdf, 0xf9, 0x16, 0x61, 0x8c, 0x70, 0xa2, 0x15, - 0x48, 0x01, 0xd1, 0xdd, 0x26, 0xfc, 0x50, 0x00, 0x21, 0xc4, 0x92, 0xd0, 0x46, 0x34, 0x69, 0x34, - 0x4e, 0x40, 0xa2, 0x48, 0x74, 0xb2, 0x3b, 0x59, 0x6f, 0xe3, 0xdd, 0x19, 0xed, 0x8c, 0x5d, 0x7c, - 0x2a, 0x12, 0x77, 0x04, 0xdc, 0x39, 0xf2, 0x9f, 0x20, 0x91, 0x63, 0x0f, 0x1c, 0x7a, 0x8a, 0x88, - 0xf9, 0x2f, 0x7a, 0x01, 0xcd, 0xec, 0xec, 0x8f, 0xc4, 0x89, 0x12, 0xea, 0xde, 0x76, 0xde, 0x7c, - 0xde, 0xe7, 0xbd, 0xf7, 0x99, 0x37, 0x6f, 0x16, 0x6c, 0xfa, 0x81, 0xe8, 0x0d, 0xf6, 0x2d, 0x97, - 0x86, 0x36, 0x8e, 0x7d, 0xca, 0x62, 0xfa, 0x50, 0x7d, 0xdc, 0x24, 0x43, 0x12, 0x09, 0x6e, 0xb3, - 0x43, 0xdf, 0xc6, 0x2c, 0xe0, 0xb6, 0x8f, 0x05, 0x79, 0x84, 0x47, 0xf6, 0x70, 0x05, 0xf7, 0x59, - 0x0f, 0xaf, 0xd8, 0x3e, 0x89, 0x48, 0x8c, 0x05, 0xf1, 0x2c, 0x16, 0x53, 0x41, 0xe1, 0x07, 0x39, - 0x95, 0x95, 0x52, 0xa9, 0x8f, 0x6f, 0x13, 0x2a, 0x8b, 0x1d, 0xfa, 0x96, 0xa4, 0xb2, 0x34, 0x95, - 0x95, 0x52, 0xb5, 0x6f, 0x16, 0xb2, 0xf0, 0xa9, 0x4f, 0x6d, 0xc5, 0xb8, 0x3f, 0x38, 0x50, 0x2b, - 0xb5, 0x50, 0x5f, 0x49, 0xa4, 0xb6, 0x79, 0xb8, 0xc6, 0xad, 0x80, 0xca, 0xbc, 0x6c, 0x97, 0xc6, - 0xc4, 0x1e, 0x4e, 0x64, 0xd3, 0x7e, 0x37, 0xc7, 0x84, 0xd8, 0xed, 0x05, 0x11, 0x89, 0x47, 0x79, - 0x31, 0x21, 0x11, 0xf8, 0x3c, 0x2f, 0xfb, 0x22, 0xaf, 0x78, 0x10, 0x89, 0x20, 0x24, 0x13, 0x0e, - 0xef, 0x5f, 0xe6, 0xc0, 0xdd, 0x1e, 0x09, 0xf1, 0x84, 0xdf, 0x3b, 0x17, 0xf9, 0x0d, 0x44, 0xd0, - 0xb7, 0x83, 0x48, 0x70, 0x11, 0x9f, 0x75, 0x32, 0x7f, 0x29, 0x81, 0x85, 0xf5, 0x80, 0x33, 0x2c, - 0xdc, 0xde, 0x8e, 0xb4, 0xb8, 0xb4, 0x0f, 0xd7, 0x40, 0x45, 0x8c, 0x18, 0x69, 0x19, 0x4b, 0xc6, - 0x72, 0xc3, 0x79, 0xfd, 0xe8, 0x78, 0x71, 0x66, 0x7c, 0xbc, 0x58, 0xd9, 0x1d, 0x31, 0xf2, 0xec, - 0x78, 0xf1, 0xc6, 0x59, 0xbc, 0xb4, 0x23, 0xe5, 0x01, 0x31, 0xa8, 0xf4, 0x84, 0x60, 0xad, 0xd2, - 0x92, 0xb1, 0xdc, 0x5c, 0xfd, 0xc4, 0x7a, 0xee, 0xf3, 0xb3, 0xee, 0x08, 0xc1, 0x9c, 0xb9, 0x34, - 0xb4, 0x5c, 0x21, 0x45, 0x2d, 0x43, 0x44, 0x58, 0xf0, 0x56, 0x79, 0xea, 0x10, 0xdb, 0x58, 0xf0, - 0x3c, 0x84, 0x5c, 0x21, 0x45, 0x6d, 0xfe, 0x51, 0x02, 0xb5, 0xdb, 0x09, 0x1a, 0x3e, 0x00, 0x75, - 0x79, 0xb2, 0x1e, 0x16, 0x58, 0xe9, 0xd1, 0x5c, 0xbd, 0x65, 0x25, 0x42, 0x5b, 0x45, 0xa1, 0xf3, - 0x30, 0x12, 0x6d, 0x0d, 0x57, 0xac, 0x7b, 0xfb, 0x0f, 0x89, 0x2b, 0xb6, 0x88, 0xc0, 0x0e, 0xd4, - 0x31, 0x40, 0x6e, 0x43, 0x19, 0x2b, 0x64, 0x60, 0x96, 0x0b, 0x2c, 0x06, 0x5c, 0xab, 0x76, 0x67, - 0x8a, 0x92, 0x74, 0xd6, 0x5d, 0xc5, 0xe7, 0x5c, 0xd3, 0x71, 0x67, 0x93, 0x35, 0xd2, 0x71, 0x60, - 0x0f, 0x54, 0x38, 0x23, 0xae, 0x96, 0xf0, 0xf3, 0x17, 0x10, 0x8f, 0x11, 0x37, 0x57, 0x52, 0xae, - 0x90, 0x8a, 0x60, 0xfe, 0x69, 0x80, 0xa6, 0xc6, 0xdc, 0x0d, 0xb8, 0x80, 0xdf, 0x4c, 0xa8, 0x69, - 0x5d, 0x4d, 0x4d, 0xe9, 0xad, 0xb4, 0x5c, 0xd0, 0x51, 0xea, 0xa9, 0xa5, 0xa0, 0xa4, 0x0f, 0xaa, - 0x81, 0x20, 0xa1, 0x14, 0xb2, 0xbc, 0xdc, 0x5c, 0x75, 0xa6, 0x2f, 0xcc, 0x99, 0xd7, 0xe1, 0xaa, - 0x9b, 0x92, 0x18, 0x25, 0xfc, 0xe6, 0x8f, 0x06, 0x68, 0x6b, 0xc4, 0x36, 0x15, 0xc1, 0x41, 0xe0, - 0x62, 0x11, 0xd0, 0xe8, 0x2b, 0x79, 0x2b, 0x48, 0x0c, 0x97, 0x64, 0x8b, 0x86, 0xe9, 0xfd, 0x29, - 0x74, 0x58, 0x48, 0x90, 0xda, 0x91, 0x08, 0x46, 0x63, 0xa1, 0x4e, 0xbc, 0x80, 0xd8, 0xa1, 0xb1, - 0x40, 0x6a, 0x07, 0xbe, 0x0d, 0xea, 0x24, 0xf2, 0x18, 0x0d, 0x22, 0xa1, 0xce, 0xa9, 0x91, 0x57, - 0xbe, 0xa1, 0xed, 0x28, 0x43, 0x98, 0xff, 0x54, 0x32, 0x9d, 0xa5, 0xfa, 0xf0, 0x36, 0x00, 0x1e, - 0x61, 0x7d, 0xaa, 0x56, 0x5a, 0xe9, 0x97, 0x0b, 0x4a, 0x5b, 0x72, 0xc6, 0x49, 0x5d, 0x77, 0xa8, - 0xe7, 0x5c, 0x93, 0xad, 0xb9, 0x9e, 0xc1, 0x51, 0xc1, 0x15, 0xda, 0xa0, 0xe1, 0xd2, 0xe8, 0x20, - 0xf0, 0x43, 0xcc, 0x74, 0xb6, 0xff, 0xd3, 0x79, 0x34, 0x3e, 0x53, 0x1b, 0x5b, 0x98, 0xa1, 0x1c, - 0x23, 0x2b, 0x53, 0xb3, 0xa3, 0x7c, 0xba, 0xb2, 0xc2, 0x8c, 0x58, 0x03, 0x73, 0x4a, 0xfe, 0x2f, - 0x49, 0xcc, 0x03, 0x1a, 0xb5, 0x2a, 0x0a, 0x79, 0x43, 0x23, 0xe7, 0x36, 0x0a, 0x7b, 0xe8, 0x14, - 0x12, 0x6e, 0x83, 0x26, 0x27, 0xf1, 0x30, 0x70, 0x89, 0x2a, 0xab, 0xaa, 0xca, 0x7a, 0xf5, 0xbc, - 0xb2, 0xba, 0x09, 0xcc, 0xb9, 0x3e, 0x3e, 0x5e, 0x6c, 0x76, 0x73, 0x1f, 0x54, 0x24, 0x80, 0x23, - 0x50, 0x7f, 0x94, 0x1c, 0x19, 0x6f, 0xcd, 0x2a, 0xb2, 0x7b, 0xd3, 0x8c, 0x93, 0xc9, 0x4e, 0xe0, - 0xce, 0x9c, 0x3c, 0xb0, 0x74, 0x85, 0xb2, 0x70, 0xf0, 0x23, 0x30, 0xcf, 0x62, 0xea, 0x12, 0xce, - 0x69, 0x2c, 0x4f, 0xbd, 0x55, 0x53, 0x2a, 0xbc, 0xa4, 0x55, 0x98, 0xdf, 0x29, 0x6e, 0xa2, 0xd3, - 0x58, 0xf8, 0xb3, 0x01, 0x16, 0xbc, 0x33, 0x43, 0xb8, 0x55, 0x57, 0x05, 0x7c, 0x31, 0x45, 0x01, - 0x67, 0xe7, 0xba, 0xd3, 0xd2, 0xd9, 0x4c, 0xbc, 0x10, 0x68, 0x22, 0xbc, 0xf9, 0x7b, 0x19, 0xcc, - 0x9f, 0x9a, 0x3e, 0xf0, 0x16, 0xa8, 0xb2, 0x1e, 0xe6, 0xe9, 0x35, 0x68, 0xa7, 0x37, 0x69, 0x47, - 0x1a, 0x9f, 0x1d, 0x2f, 0x36, 0xb6, 0xa9, 0x47, 0xd4, 0x02, 0x25, 0x40, 0x78, 0x1f, 0x34, 0xb8, - 0xc0, 0xb1, 0x20, 0xde, 0xa7, 0x42, 0x0f, 0xc3, 0xb7, 0xae, 0x36, 0x1e, 0x76, 0x83, 0x90, 0xe4, - 0x8d, 0xd9, 0x4d, 0x49, 0x50, 0xce, 0x07, 0xdf, 0x04, 0xb5, 0x90, 0x70, 0x8e, 0x7d, 0xa2, 0x3b, - 0xee, 0xba, 0x86, 0xd7, 0xb6, 0x12, 0x33, 0x4a, 0xf7, 0xe1, 0x77, 0xa0, 0x1a, 0x51, 0x8f, 0xf0, - 0x56, 0x55, 0xcd, 0x91, 0xee, 0x8b, 0x1a, 0xc8, 0x96, 0xac, 0x98, 0x6f, 0x44, 0x22, 0x2e, 0x0c, - 0x16, 0x65, 0x43, 0x49, 0xc0, 0xf6, 0x63, 0x00, 0x72, 0x0c, 0x5c, 0x00, 0xe5, 0x43, 0x32, 0x4a, - 0xf4, 0x43, 0xf2, 0x13, 0xde, 0x07, 0xd5, 0x21, 0xee, 0x0f, 0x88, 0x56, 0x67, 0x63, 0xaa, 0x76, - 0xf5, 0x88, 0x7e, 0x17, 0x12, 0xce, 0x0f, 0x4b, 0x6b, 0x86, 0xb9, 0x0c, 0xd4, 0x5b, 0x9b, 0x0d, - 0x28, 0xe3, 0xa2, 0x01, 0x65, 0xbe, 0x01, 0xd4, 0x93, 0x09, 0x5f, 0x03, 0xe5, 0x41, 0xdc, 0xd7, - 0xc0, 0xa6, 0x06, 0x96, 0xf7, 0xd0, 0x5d, 0x24, 0xed, 0xe6, 0x6f, 0xe5, 0xa4, 0x24, 0xdd, 0x14, - 0x6d, 0x50, 0x0a, 0x3c, 0x0d, 0x06, 0x1a, 0x5c, 0xda, 0x5c, 0x47, 0xa5, 0xc0, 0xcb, 0xc6, 0x66, - 0xf9, 0xc2, 0xb1, 0xf9, 0x1e, 0x68, 0xca, 0xc6, 0xeb, 0xe3, 0x91, 0x34, 0xaa, 0x01, 0xd0, 0x70, - 0xfe, 0xaf, 0x81, 0xcd, 0xf5, 0x7c, 0x0b, 0x15, 0x71, 0x79, 0x27, 0xce, 0x5e, 0xb5, 0x13, 0x1f, - 0x14, 0x3b, 0xb1, 0xa6, 0xb4, 0xb6, 0xaf, 0xd6, 0x89, 0x5b, 0x81, 0x1b, 0xd3, 0xff, 0xd6, 0x8e, - 0xf5, 0x4b, 0xda, 0xd1, 0x05, 0x60, 0xc0, 0x3c, 0x2c, 0x88, 0xa4, 0x6d, 0x35, 0x9e, 0x2f, 0x9b, - 0xec, 0x1f, 0x64, 0x2f, 0xa3, 0x42, 0x05, 0x5a, 0xf3, 0xd7, 0x12, 0xb8, 0x71, 0xde, 0x04, 0x83, - 0x3f, 0x18, 0xa0, 0xae, 0x9b, 0x87, 0xb7, 0x0c, 0x75, 0x21, 0xf6, 0xa6, 0xbf, 0x10, 0xe7, 0x84, - 0xca, 0x1f, 0x38, 0x8d, 0xe1, 0x28, 0x0b, 0x0c, 0x1f, 0x83, 0x1a, 0x27, 0x11, 0xa7, 0x71, 0xfa, - 0xb8, 0xef, 0x4e, 0x91, 0x43, 0x57, 0x31, 0x9d, 0x97, 0x42, 0x76, 0x08, 0x09, 0x84, 0xa3, 0x34, - 0xaa, 0xf9, 0x31, 0x78, 0xe5, 0x42, 0xb7, 0xcb, 0x1f, 0x7c, 0xc7, 0x3a, 0x3a, 0xe9, 0xcc, 0x3c, - 0x39, 0xe9, 0xcc, 0x3c, 0x3d, 0xe9, 0xcc, 0x7c, 0x3f, 0xee, 0x18, 0x47, 0xe3, 0x8e, 0xf1, 0x64, - 0xdc, 0x31, 0x9e, 0x8e, 0x3b, 0xc6, 0x5f, 0xe3, 0x8e, 0xf1, 0xd3, 0xdf, 0x9d, 0x99, 0xaf, 0xeb, - 0x69, 0x8a, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x6e, 0x73, 0x3d, 0xd7, 0x45, 0x0d, 0x00, 0x00, + proto.RegisterFile("github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1/generated.proto", fileDescriptor_generated_80114384d8f9498c) +} + +var fileDescriptor_generated_80114384d8f9498c = []byte{ + // 1222 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0x4d, 0x6f, 0x1b, 0x45, + 0x18, 0xce, 0xfa, 0x23, 0xb6, 0xc7, 0x49, 0x1b, 0x86, 0x22, 0x8c, 0x11, 0x4e, 0xb5, 0xa7, 0x80, + 0xda, 0xdd, 0xb6, 0x7c, 0x28, 0x80, 0x50, 0x85, 0x9b, 0xd0, 0x44, 0x34, 0x69, 0x34, 0x4e, 0x40, + 0xa2, 0x95, 0xe8, 0x64, 0x77, 0xb2, 0xde, 0xc6, 0xbb, 0x33, 0xda, 0x19, 0xbb, 0xf8, 0x54, 0x24, + 0xee, 0x15, 0x7f, 0x80, 0x23, 0x7f, 0x81, 0x5f, 0x80, 0x44, 0x8e, 0x3d, 0x70, 0x28, 0x97, 0x88, + 0x98, 0x7f, 0x51, 0x71, 0x40, 0x33, 0x3b, 0xfb, 0x91, 0x38, 0x56, 0x4c, 0xdd, 0x9b, 0x67, 0xe6, + 0x79, 0x9f, 0x77, 0xde, 0xaf, 0x67, 0xc7, 0x60, 0xd3, 0xf3, 0x45, 0xb7, 0xbf, 0x6f, 0x39, 0x34, + 0xb0, 0x71, 0xe4, 0x51, 0x16, 0xd1, 0xc7, 0xea, 0xc7, 0x75, 0x32, 0x20, 0xa1, 0xe0, 0x36, 0x3b, + 0xf4, 0x6c, 0xcc, 0x7c, 0x6e, 0x7b, 0x58, 0x90, 0x27, 0x78, 0x68, 0x0f, 0x6e, 0xe2, 0x1e, 0xeb, + 0xe2, 0x9b, 0xb6, 0x47, 0x42, 0x12, 0x61, 0x41, 0x5c, 0x8b, 0x45, 0x54, 0x50, 0xf8, 0x69, 0x46, + 0x65, 0x25, 0x54, 0xea, 0xc7, 0xf7, 0x31, 0x95, 0xc5, 0x0e, 0x3d, 0x4b, 0x52, 0x59, 0x9a, 0xca, + 0x4a, 0xa8, 0x9a, 0x1b, 0x53, 0xdf, 0x82, 0x93, 0x90, 0xd3, 0x68, 0xe2, 0x25, 0x9a, 0xd7, 0x73, + 0x4c, 0x1e, 0xf5, 0xa8, 0xad, 0xb6, 0xf7, 0xfb, 0x07, 0x6a, 0xa5, 0x16, 0xea, 0x97, 0x86, 0x9b, + 0x87, 0xab, 0xdc, 0xf2, 0xa9, 0xe4, 0xb6, 0x1d, 0x1a, 0x11, 0x7b, 0x30, 0x4e, 0xf9, 0x51, 0x86, + 0x09, 0xb0, 0xd3, 0xf5, 0x43, 0x12, 0x0d, 0xb3, 0x0b, 0x05, 0x44, 0xe0, 0xf3, 0xac, 0xec, 0x49, + 0x56, 0x51, 0x3f, 0x14, 0x7e, 0x40, 0xc6, 0x0c, 0x3e, 0xb9, 0xc8, 0x80, 0x3b, 0x5d, 0x12, 0xe0, + 0x31, 0xbb, 0x0f, 0x27, 0xd9, 0xf5, 0x85, 0xdf, 0xb3, 0xfd, 0x50, 0x70, 0x11, 0x9d, 0x35, 0x32, + 0x7f, 0x2b, 0x80, 0xa5, 0x35, 0x9f, 0x33, 0x2c, 0x9c, 0xee, 0x8e, 0xdc, 0x71, 0x68, 0x0f, 0x3e, + 0x04, 0x25, 0x31, 0x64, 0xa4, 0x61, 0x5c, 0x35, 0x56, 0x6a, 0xed, 0x8d, 0xa3, 0xe3, 0xe5, 0xb9, + 0xd1, 0xf1, 0x72, 0x69, 0x77, 0xc8, 0xc8, 0xcb, 0xe3, 0xe5, 0xd5, 0x8b, 0x6a, 0xe4, 0xd0, 0x20, + 0xa0, 0xa1, 0xb5, 0x2e, 0x57, 0x09, 0xa7, 0xb4, 0x45, 0x8a, 0x15, 0x62, 0x50, 0xea, 0x0a, 0xc1, + 0x1a, 0x85, 0xab, 0xc6, 0x4a, 0xfd, 0xd6, 0x6d, 0xeb, 0x95, 0xbb, 0xc5, 0xda, 0x10, 0x82, 0xb5, + 0x17, 0x92, 0xeb, 0xc9, 0x15, 0x52, 0xd4, 0xd2, 0x45, 0x88, 0x05, 0x6f, 0x14, 0x67, 0x76, 0xb1, + 0x8d, 0x05, 0xcf, 0x5c, 0xc8, 0x15, 0x52, 0xd4, 0xe6, 0x1f, 0x05, 0x50, 0xb9, 0x1b, 0xa3, 0xe1, + 0x23, 0x50, 0x95, 0xd5, 0x77, 0xb1, 0xc0, 0x2a, 0x67, 0xf5, 0x5b, 0x37, 0xac, 0xb8, 0x18, 0x56, + 0xbe, 0x18, 0x99, 0x1b, 0x89, 0xb6, 0x06, 0x37, 0xad, 0xfb, 0xfb, 0x8f, 0x89, 0x23, 0xb6, 0x88, + 0xc0, 0x6d, 0xa8, 0x7d, 0x80, 0x6c, 0x0f, 0xa5, 0xac, 0x90, 0x81, 0x79, 0x2e, 0xb0, 0xe8, 0x73, + 0x9d, 0xb5, 0x8d, 0x19, 0x42, 0xd2, 0xb7, 0xee, 0x28, 0xbe, 0xf6, 0x25, 0xed, 0x77, 0x3e, 0x5e, + 0x23, 0xed, 0x07, 0x76, 0x41, 0x89, 0x33, 0xe2, 0xe8, 0x14, 0x7e, 0xf5, 0x1a, 0xfc, 0x31, 0xe2, + 0x64, 0x99, 0x94, 0x2b, 0xa4, 0x3c, 0x98, 0x7f, 0x1a, 0xa0, 0xae, 0x31, 0xf7, 0x7c, 0x2e, 0xe0, + 0xc3, 0xb1, 0x6c, 0x5a, 0xd3, 0x65, 0x53, 0x5a, 0xab, 0x5c, 0x2e, 0x69, 0x2f, 0xd5, 0x64, 0x27, + 0x97, 0x49, 0x0f, 0x94, 0x7d, 0x41, 0x02, 0x99, 0xc8, 0xe2, 0x4a, 0xfd, 0x56, 0x7b, 0xf6, 0xc0, + 0xda, 0x8b, 0xda, 0x5d, 0x79, 0x53, 0x12, 0xa3, 0x98, 0xdf, 0x7c, 0x66, 0x80, 0xa6, 0x46, 0x6c, + 0x53, 0xe1, 0x1f, 0xf8, 0x0e, 0x16, 0x3e, 0x0d, 0xbf, 0x95, 0x93, 0x46, 0x22, 0x78, 0x55, 0xb6, + 0x68, 0x90, 0xcc, 0x58, 0xae, 0xc3, 0x02, 0x82, 0xd4, 0x89, 0x44, 0x30, 0x1a, 0x09, 0x55, 0xf1, + 0x1c, 0x62, 0x87, 0x46, 0x02, 0xa9, 0x13, 0x78, 0x0d, 0x54, 0x49, 0xe8, 0x32, 0xea, 0x87, 0x42, + 0xd5, 0xa9, 0x96, 0x45, 0xbe, 0xae, 0xf7, 0x51, 0x8a, 0x30, 0xff, 0x2d, 0xa5, 0x79, 0x96, 0xd9, + 0x87, 0x77, 0x01, 0x70, 0x09, 0xeb, 0x51, 0xb5, 0xd2, 0x99, 0x7e, 0x3b, 0x97, 0x69, 0x4b, 0xea, + 0xa0, 0xcc, 0xeb, 0x0e, 0x75, 0xdb, 0x97, 0x64, 0x6b, 0xae, 0xa5, 0x70, 0x94, 0x33, 0x85, 0x36, + 0xa8, 0x39, 0x34, 0x3c, 0xf0, 0xbd, 0x00, 0x33, 0x7d, 0xdb, 0x37, 0xf4, 0x3d, 0x6a, 0x77, 0xd4, + 0xc1, 0x16, 0x66, 0x28, 0xc3, 0xc8, 0xc8, 0x94, 0xbe, 0x14, 0x4f, 0x47, 0x96, 0xd3, 0x88, 0x55, + 0xb0, 0xa0, 0xd2, 0xff, 0x0d, 0x89, 0xb8, 0x4f, 0xc3, 0x46, 0x49, 0x21, 0xaf, 0x68, 0xe4, 0xc2, + 0x7a, 0xee, 0x0c, 0x9d, 0x42, 0xc2, 0x6d, 0x50, 0xe7, 0x24, 0x1a, 0xf8, 0x0e, 0x51, 0x61, 0x95, + 0x55, 0x58, 0xef, 0x9e, 0x17, 0x56, 0x27, 0x86, 0xb5, 0x2f, 0x8f, 0x8e, 0x97, 0xeb, 0x9d, 0xcc, + 0x06, 0xe5, 0x09, 0xe0, 0x10, 0x54, 0x9f, 0xc4, 0x25, 0xe3, 0x8d, 0x79, 0x45, 0x76, 0x7f, 0x16, + 0x39, 0x19, 0xef, 0x04, 0xde, 0x5e, 0x90, 0x05, 0x4b, 0x56, 0x28, 0x75, 0x07, 0x3f, 0x07, 0x8b, + 0x2c, 0xa2, 0x0e, 0xe1, 0x9c, 0x46, 0xb2, 0xea, 0x8d, 0x8a, 0xca, 0xc2, 0x5b, 0x3a, 0x0b, 0x8b, + 0x3b, 0xf9, 0x43, 0x74, 0x1a, 0x0b, 0x9f, 0x19, 0x60, 0xc9, 0x3d, 0x23, 0xec, 0x8d, 0xaa, 0x0a, + 0xe0, 0xeb, 0x19, 0x02, 0x38, 0xfb, 0xad, 0xc8, 0x6e, 0x73, 0x4a, 0xee, 0xd1, 0x98, 0x6f, 0xf3, + 0xf7, 0x22, 0x58, 0x3c, 0x25, 0x3d, 0xf0, 0x06, 0x28, 0xb3, 0x2e, 0xe6, 0xc9, 0x0c, 0x34, 0x93, + 0x31, 0xda, 0x91, 0x9b, 0x2f, 0x8f, 0x97, 0x6b, 0xdb, 0xd4, 0x25, 0x6a, 0x81, 0x62, 0x20, 0x7c, + 0x00, 0x6a, 0x5c, 0xe0, 0x48, 0x10, 0xf7, 0x4b, 0xa1, 0x95, 0xf0, 0x83, 0xe9, 0xb4, 0x61, 0xd7, + 0x0f, 0x48, 0xd6, 0x95, 0x9d, 0x84, 0x04, 0x65, 0x7c, 0xf0, 0x7d, 0x50, 0x09, 0x08, 0xe7, 0xd8, + 0x23, 0xba, 0xdd, 0x2e, 0x6b, 0x78, 0x65, 0x2b, 0xde, 0x46, 0xc9, 0x39, 0xfc, 0x01, 0x94, 0x43, + 0xea, 0x12, 0xde, 0x28, 0x2b, 0x11, 0xe9, 0xbc, 0x2e, 0x35, 0xb6, 0x64, 0xc4, 0x7c, 0x3d, 0x14, + 0x51, 0x4e, 0x55, 0xd4, 0x1e, 0x8a, 0x1d, 0x36, 0x9f, 0x02, 0x90, 0x61, 0xe0, 0x12, 0x28, 0x1e, + 0x92, 0x61, 0x9c, 0x3f, 0x24, 0x7f, 0xc2, 0x07, 0xa0, 0x3c, 0xc0, 0xbd, 0x3e, 0xd1, 0xd9, 0x59, + 0x9f, 0xa9, 0x57, 0x5d, 0xa2, 0x3f, 0x0a, 0x31, 0xe7, 0x67, 0x85, 0x55, 0xc3, 0x5c, 0x01, 0xea, + 0x43, 0x9b, 0xaa, 0x93, 0x31, 0x49, 0x9d, 0xcc, 0xbf, 0x0c, 0xa0, 0x3e, 0x98, 0xf0, 0x3d, 0x50, + 0xec, 0x47, 0x3d, 0x8d, 0xac, 0x6b, 0x64, 0x71, 0x0f, 0xdd, 0x43, 0x72, 0x1f, 0x76, 0xb4, 0x1a, + 0xc4, 0xca, 0x71, 0xfb, 0xcc, 0x6b, 0xc3, 0x9e, 0xf2, 0xb5, 0x21, 0x3d, 0xe5, 0x04, 0xe4, 0x1a, + 0xa8, 0x3a, 0x3d, 0x9f, 0x84, 0x62, 0xd3, 0x3d, 0x2b, 0x8d, 0x77, 0xf4, 0x3e, 0x4a, 0x11, 0x4a, + 0xc1, 0x7a, 0x7d, 0x2e, 0x48, 0xb4, 0xe9, 0xea, 0xe2, 0x67, 0x0a, 0x96, 0x1c, 0xa0, 0x0c, 0x63, + 0xfe, 0x5a, 0x8c, 0xeb, 0xa0, 0x3b, 0xb9, 0x09, 0x0a, 0xbe, 0xab, 0x03, 0x04, 0xda, 0xb0, 0xb0, + 0xb9, 0x86, 0x0a, 0xbe, 0x9b, 0x0a, 0x7d, 0x71, 0xa2, 0xd0, 0x7f, 0x0c, 0xea, 0x72, 0x5a, 0x7a, + 0x78, 0x28, 0x37, 0x95, 0x64, 0xd5, 0xda, 0x6f, 0x6a, 0x60, 0x7d, 0x2d, 0x3b, 0x42, 0x79, 0x5c, + 0x36, 0x3e, 0xf3, 0xd3, 0x8e, 0xcf, 0xa3, 0xfc, 0xf8, 0x54, 0x54, 0x83, 0xd8, 0xd3, 0x8d, 0xcf, + 0x96, 0xef, 0x44, 0xf4, 0xff, 0xcd, 0x50, 0xf5, 0x82, 0x19, 0x72, 0x00, 0xe8, 0x33, 0x17, 0x0b, + 0x22, 0x69, 0x1b, 0xb5, 0x57, 0xbb, 0x4d, 0xfa, 0x6a, 0xda, 0x4b, 0xa9, 0x50, 0x8e, 0xd6, 0xfc, + 0xa5, 0x00, 0xae, 0x9c, 0xa7, 0xb9, 0xf0, 0x27, 0x03, 0x54, 0x75, 0xc7, 0xf3, 0x86, 0xa1, 0xa6, + 0x78, 0x6f, 0xf6, 0x29, 0x3e, 0xc7, 0x55, 0xd6, 0x77, 0x1a, 0xc3, 0x51, 0xea, 0x18, 0x3e, 0x05, + 0x95, 0xf8, 0x7f, 0x4c, 0xf2, 0x1c, 0xd9, 0x9d, 0xe1, 0x0e, 0x1d, 0xc5, 0x74, 0xde, 0x15, 0xd2, + 0x22, 0xc4, 0x10, 0x8e, 0x12, 0xaf, 0xe6, 0x17, 0xe0, 0x9d, 0x89, 0x66, 0x17, 0x3f, 0x51, 0xda, + 0xd6, 0xd1, 0x49, 0x6b, 0xee, 0xf9, 0x49, 0x6b, 0xee, 0xc5, 0x49, 0x6b, 0xee, 0xc7, 0x51, 0xcb, + 0x38, 0x1a, 0xb5, 0x8c, 0xe7, 0xa3, 0x96, 0xf1, 0x62, 0xd4, 0x32, 0xfe, 0x1e, 0xb5, 0x8c, 0x9f, + 0xff, 0x69, 0xcd, 0x7d, 0x57, 0x4d, 0xae, 0xf8, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xaf, 0xad, + 0x3d, 0x00, 0x65, 0x0e, 0x00, 0x00, } diff --git a/pkg/apis/gateway/v1alpha1/generated.proto b/pkg/apis/gateway/v1alpha1/generated.proto index acc686abc1..4dd14d153c 100644 --- a/pkg/apis/gateway/v1alpha1/generated.proto +++ b/pkg/apis/gateway/v1alpha1/generated.proto @@ -19,6 +19,7 @@ syntax = 'proto2'; package github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1; +import "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1/generated.proto"; import "k8s.io/api/core/v1/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; @@ -126,6 +127,12 @@ message Http { message Nats { optional string url = 1; + + optional string type = 2; + + optional string clientId = 3; + + optional string clusterId = 4; } // NodeStatus describes the status for an individual node in the gateway configurations. diff --git a/pkg/apis/gateway/v1alpha1/openapi_generated.go b/pkg/apis/gateway/v1alpha1/openapi_generated.go index f623556226..e04dfbf611 100644 --- a/pkg/apis/gateway/v1alpha1/openapi_generated.go +++ b/pkg/apis/gateway/v1alpha1/openapi_generated.go @@ -313,8 +313,26 @@ func schema_pkg_apis_gateway_v1alpha1_Nats(ref common.ReferenceCallback) common. Format: "", }, }, + "type": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + "clientId": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + "clusterId": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, }, - Required: []string{"url"}, + Required: []string{"url", "type"}, }, }, Dependencies: []string{}, diff --git a/pkg/apis/gateway/v1alpha1/types.go b/pkg/apis/gateway/v1alpha1/types.go index d5c3540287..e15c7dfea3 100644 --- a/pkg/apis/gateway/v1alpha1/types.go +++ b/pkg/apis/gateway/v1alpha1/types.go @@ -17,6 +17,7 @@ limitations under the License. package v1alpha1 import ( + "github.com/argoproj/argo-events/common" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -34,15 +35,6 @@ const ( NodePhaseResourceUpdate NodePhase = "ResourceUpdate" // resource is updated ) -// DispatchProtocolType is type of the event dispatch protocol. Used for dispatching events from gateway to watchers -type DispatchProtocolType string - -// possible types of event dispatch protocol -const ( - HTTPGateway DispatchProtocolType = "HTTP" - NATSGateway DispatchProtocolType = "NATS" -) - // Gateway is the definition of a gateway resource // +genclient // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object @@ -95,7 +87,7 @@ type GatewaySpec struct { ProcessorPort string `json:"processorPort" protobuf:"bytes,7,opt,name=processorPort"` // EventProtocol is the underlying protocol used to send events from gateway to watchers(components interested in listening to event from this gateway) - DispatchProtocol DispatchProtocol `json:"dispatchProtocol" protobuf:"bytes,8,opt,name=dispatchProtocol"` + EventProtocol DispatchProtocol `json:"dispatchProtocol" protobuf:"bytes,8,opt,name=dispatchProtocol"` } // GatewayStatus contains information about the status of a gateway. @@ -172,7 +164,7 @@ type SensorNotificationWatcher struct { // Dispatch protocol contains configuration necessary to dispatch an event to sensor over different communication protocols type DispatchProtocol struct { - Type DispatchProtocolType `json:"type" protobuf:"bytes,1,opt,name=type"` + Type common.EventProtocolType `json:"type" protobuf:"bytes,1,opt,name=type"` Http Http `json:"http" protobuf:"bytes,2,opt,name=http"` @@ -185,4 +177,10 @@ type Http struct { type Nats struct { URL string `json:"url" protobuf:"bytes,1,opt,name=url"` + + Type common.NatsType `json:"type" protobuf:"bytes,2,opt,name=type"` + + ClientId string `json:"clientId,omitempty" protobuf:"bytes,3,opt,name=clientId"` + + ClusterId string `json:"clusterId,omitempty" protobuf:"bytes,4,opt,name=clusterId"` } diff --git a/pkg/apis/gateway/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/gateway/v1alpha1/zz_generated.deepcopy.go index 529f3efe0d..3c007a2d93 100644 --- a/pkg/apis/gateway/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/gateway/v1alpha1/zz_generated.deepcopy.go @@ -137,7 +137,7 @@ func (in *GatewaySpec) DeepCopyInto(out *GatewaySpec) { *out = new(NotificationWatchers) (*in).DeepCopyInto(*out) } - out.DispatchProtocol = in.DispatchProtocol + out.EventProtocol = in.EventProtocol return } diff --git a/pkg/apis/sensor/v1alpha1/generated.pb.go b/pkg/apis/sensor/v1alpha1/generated.pb.go index 49f4aafd84..69cb1f73cd 100644 --- a/pkg/apis/sensor/v1alpha1/generated.pb.go +++ b/pkg/apis/sensor/v1alpha1/generated.pb.go @@ -23,6 +23,7 @@ import math "math" import v11 "k8s.io/api/core/v1" +import github_com_argoproj_argo_events_common "github.com/argoproj/argo-events/common" import github_com_minio_minio_go "github.com/minio/minio-go" import github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys" @@ -46,7 +47,7 @@ const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package func (m *ArtifactLocation) Reset() { *m = ArtifactLocation{} } func (*ArtifactLocation) ProtoMessage() {} func (*ArtifactLocation) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_558b4bfc5fa3d402, []int{0} + return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{0} } func (m *ArtifactLocation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -74,7 +75,7 @@ var xxx_messageInfo_ArtifactLocation proto.InternalMessageInfo func (m *ConfigmapArtifact) Reset() { *m = ConfigmapArtifact{} } func (*ConfigmapArtifact) ProtoMessage() {} func (*ConfigmapArtifact) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_558b4bfc5fa3d402, []int{1} + return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{1} } func (m *ConfigmapArtifact) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -102,7 +103,7 @@ var xxx_messageInfo_ConfigmapArtifact proto.InternalMessageInfo func (m *Data) Reset() { *m = Data{} } func (*Data) ProtoMessage() {} func (*Data) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_558b4bfc5fa3d402, []int{2} + return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{2} } func (m *Data) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -130,7 +131,7 @@ var xxx_messageInfo_Data proto.InternalMessageInfo func (m *DataFilter) Reset() { *m = DataFilter{} } func (*DataFilter) ProtoMessage() {} func (*DataFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_558b4bfc5fa3d402, []int{3} + return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{3} } func (m *DataFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -155,38 +156,10 @@ func (m *DataFilter) XXX_DiscardUnknown() { var xxx_messageInfo_DataFilter proto.InternalMessageInfo -func (m *EscalationPolicy) Reset() { *m = EscalationPolicy{} } -func (*EscalationPolicy) ProtoMessage() {} -func (*EscalationPolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_558b4bfc5fa3d402, []int{4} -} -func (m *EscalationPolicy) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EscalationPolicy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalTo(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (dst *EscalationPolicy) XXX_Merge(src proto.Message) { - xxx_messageInfo_EscalationPolicy.Merge(dst, src) -} -func (m *EscalationPolicy) XXX_Size() int { - return m.Size() -} -func (m *EscalationPolicy) XXX_DiscardUnknown() { - xxx_messageInfo_EscalationPolicy.DiscardUnknown(m) -} - -var xxx_messageInfo_EscalationPolicy proto.InternalMessageInfo - func (m *Event) Reset() { *m = Event{} } func (*Event) ProtoMessage() {} func (*Event) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_558b4bfc5fa3d402, []int{5} + return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{4} } func (m *Event) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -214,7 +187,7 @@ var xxx_messageInfo_Event proto.InternalMessageInfo func (m *EventContext) Reset() { *m = EventContext{} } func (*EventContext) ProtoMessage() {} func (*EventContext) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_558b4bfc5fa3d402, []int{6} + return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{5} } func (m *EventContext) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -242,7 +215,7 @@ var xxx_messageInfo_EventContext proto.InternalMessageInfo func (m *EventDependency) Reset() { *m = EventDependency{} } func (*EventDependency) ProtoMessage() {} func (*EventDependency) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_558b4bfc5fa3d402, []int{7} + return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{6} } func (m *EventDependency) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -270,7 +243,7 @@ var xxx_messageInfo_EventDependency proto.InternalMessageInfo func (m *EventDependencyFilter) Reset() { *m = EventDependencyFilter{} } func (*EventDependencyFilter) ProtoMessage() {} func (*EventDependencyFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_558b4bfc5fa3d402, []int{8} + return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{7} } func (m *EventDependencyFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -298,7 +271,7 @@ var xxx_messageInfo_EventDependencyFilter proto.InternalMessageInfo func (m *EventProtocol) Reset() { *m = EventProtocol{} } func (*EventProtocol) ProtoMessage() {} func (*EventProtocol) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_558b4bfc5fa3d402, []int{9} + return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{8} } func (m *EventProtocol) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -326,7 +299,7 @@ var xxx_messageInfo_EventProtocol proto.InternalMessageInfo func (m *FileArtifact) Reset() { *m = FileArtifact{} } func (*FileArtifact) ProtoMessage() {} func (*FileArtifact) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_558b4bfc5fa3d402, []int{10} + return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{9} } func (m *FileArtifact) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -354,7 +327,7 @@ var xxx_messageInfo_FileArtifact proto.InternalMessageInfo func (m *GroupVersionKind) Reset() { *m = GroupVersionKind{} } func (*GroupVersionKind) ProtoMessage() {} func (*GroupVersionKind) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_558b4bfc5fa3d402, []int{11} + return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{10} } func (m *GroupVersionKind) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -382,7 +355,7 @@ var xxx_messageInfo_GroupVersionKind proto.InternalMessageInfo func (m *Http) Reset() { *m = Http{} } func (*Http) ProtoMessage() {} func (*Http) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_558b4bfc5fa3d402, []int{12} + return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{11} } func (m *Http) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -410,7 +383,7 @@ var xxx_messageInfo_Http proto.InternalMessageInfo func (m *Nats) Reset() { *m = Nats{} } func (*Nats) ProtoMessage() {} func (*Nats) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_558b4bfc5fa3d402, []int{13} + return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{12} } func (m *Nats) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -438,7 +411,7 @@ var xxx_messageInfo_Nats proto.InternalMessageInfo func (m *NodeStatus) Reset() { *m = NodeStatus{} } func (*NodeStatus) ProtoMessage() {} func (*NodeStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_558b4bfc5fa3d402, []int{14} + return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{13} } func (m *NodeStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -466,7 +439,7 @@ var xxx_messageInfo_NodeStatus proto.InternalMessageInfo func (m *ResourceObject) Reset() { *m = ResourceObject{} } func (*ResourceObject) ProtoMessage() {} func (*ResourceObject) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_558b4bfc5fa3d402, []int{15} + return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{14} } func (m *ResourceObject) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -494,7 +467,7 @@ var xxx_messageInfo_ResourceObject proto.InternalMessageInfo func (m *ResourceParameter) Reset() { *m = ResourceParameter{} } func (*ResourceParameter) ProtoMessage() {} func (*ResourceParameter) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_558b4bfc5fa3d402, []int{16} + return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{15} } func (m *ResourceParameter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -522,7 +495,7 @@ var xxx_messageInfo_ResourceParameter proto.InternalMessageInfo func (m *ResourceParameterSource) Reset() { *m = ResourceParameterSource{} } func (*ResourceParameterSource) ProtoMessage() {} func (*ResourceParameterSource) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_558b4bfc5fa3d402, []int{17} + return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{16} } func (m *ResourceParameterSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -550,7 +523,7 @@ var xxx_messageInfo_ResourceParameterSource proto.InternalMessageInfo func (m *RetryStrategy) Reset() { *m = RetryStrategy{} } func (*RetryStrategy) ProtoMessage() {} func (*RetryStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_558b4bfc5fa3d402, []int{18} + return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{17} } func (m *RetryStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -578,7 +551,7 @@ var xxx_messageInfo_RetryStrategy proto.InternalMessageInfo func (m *S3Artifact) Reset() { *m = S3Artifact{} } func (*S3Artifact) ProtoMessage() {} func (*S3Artifact) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_558b4bfc5fa3d402, []int{19} + return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{18} } func (m *S3Artifact) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -606,7 +579,7 @@ var xxx_messageInfo_S3Artifact proto.InternalMessageInfo func (m *S3Bucket) Reset() { *m = S3Bucket{} } func (*S3Bucket) ProtoMessage() {} func (*S3Bucket) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_558b4bfc5fa3d402, []int{20} + return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{19} } func (m *S3Bucket) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -634,7 +607,7 @@ var xxx_messageInfo_S3Bucket proto.InternalMessageInfo func (m *S3Filter) Reset() { *m = S3Filter{} } func (*S3Filter) ProtoMessage() {} func (*S3Filter) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_558b4bfc5fa3d402, []int{21} + return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{20} } func (m *S3Filter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -662,7 +635,7 @@ var xxx_messageInfo_S3Filter proto.InternalMessageInfo func (m *Sensor) Reset() { *m = Sensor{} } func (*Sensor) ProtoMessage() {} func (*Sensor) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_558b4bfc5fa3d402, []int{22} + return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{21} } func (m *Sensor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -690,7 +663,7 @@ var xxx_messageInfo_Sensor proto.InternalMessageInfo func (m *SensorList) Reset() { *m = SensorList{} } func (*SensorList) ProtoMessage() {} func (*SensorList) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_558b4bfc5fa3d402, []int{23} + return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{22} } func (m *SensorList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -718,7 +691,7 @@ var xxx_messageInfo_SensorList proto.InternalMessageInfo func (m *SensorSpec) Reset() { *m = SensorSpec{} } func (*SensorSpec) ProtoMessage() {} func (*SensorSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_558b4bfc5fa3d402, []int{24} + return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{23} } func (m *SensorSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -746,7 +719,7 @@ var xxx_messageInfo_SensorSpec proto.InternalMessageInfo func (m *SensorStatus) Reset() { *m = SensorStatus{} } func (*SensorStatus) ProtoMessage() {} func (*SensorStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_558b4bfc5fa3d402, []int{25} + return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{24} } func (m *SensorStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -774,7 +747,7 @@ var xxx_messageInfo_SensorStatus proto.InternalMessageInfo func (m *TimeFilter) Reset() { *m = TimeFilter{} } func (*TimeFilter) ProtoMessage() {} func (*TimeFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_558b4bfc5fa3d402, []int{26} + return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{25} } func (m *TimeFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -802,7 +775,7 @@ var xxx_messageInfo_TimeFilter proto.InternalMessageInfo func (m *Trigger) Reset() { *m = Trigger{} } func (*Trigger) ProtoMessage() {} func (*Trigger) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_558b4bfc5fa3d402, []int{27} + return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{26} } func (m *Trigger) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -830,7 +803,7 @@ var xxx_messageInfo_Trigger proto.InternalMessageInfo func (m *URI) Reset() { *m = URI{} } func (*URI) ProtoMessage() {} func (*URI) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_558b4bfc5fa3d402, []int{28} + return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{27} } func (m *URI) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -858,7 +831,7 @@ var xxx_messageInfo_URI proto.InternalMessageInfo func (m *URLArtifact) Reset() { *m = URLArtifact{} } func (*URLArtifact) ProtoMessage() {} func (*URLArtifact) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_558b4bfc5fa3d402, []int{29} + return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{28} } func (m *URLArtifact) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -888,7 +861,6 @@ func init() { proto.RegisterType((*ConfigmapArtifact)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.ConfigmapArtifact") proto.RegisterType((*Data)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.Data") proto.RegisterType((*DataFilter)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.DataFilter") - proto.RegisterType((*EscalationPolicy)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.EscalationPolicy") proto.RegisterType((*Event)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.Event") proto.RegisterType((*EventContext)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.EventContext") proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.EventContext.ExtensionsEntry") @@ -1039,16 +1011,6 @@ func (m *Data) MarshalTo(dAtA []byte) (int, error) { i += n } } - if m.EscalationPolicy != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.EscalationPolicy.Size())) - n5, err := m.EscalationPolicy.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n5 - } return i, nil } @@ -1079,46 +1041,6 @@ func (m *DataFilter) MarshalTo(dAtA []byte) (int, error) { i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Value))) i += copy(dAtA[i:], m.Value) - if m.EscalationPolicy != nil { - dAtA[i] = 0x22 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.EscalationPolicy.Size())) - n6, err := m.EscalationPolicy.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n6 - } - return i, nil -} - -func (m *EscalationPolicy) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EscalationPolicy) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i - var l int - _ = l - dAtA[i] = 0xa - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Level))) - i += copy(dAtA[i:], m.Level) - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Message))) - i += copy(dAtA[i:], m.Message) return i, nil } @@ -1140,11 +1062,11 @@ func (m *Event) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Context.Size())) - n7, err := m.Context.MarshalTo(dAtA[i:]) + n5, err := m.Context.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n7 + i += n5 if m.Payload != nil { dAtA[i] = 0x12 i++ @@ -1185,11 +1107,11 @@ func (m *EventContext) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Source.Size())) - n8, err := m.Source.MarshalTo(dAtA[i:]) + n6, err := m.Source.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n8 + i += n6 } dAtA[i] = 0x2a i++ @@ -1198,20 +1120,20 @@ func (m *EventContext) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x32 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.EventTime.Size())) - n9, err := m.EventTime.MarshalTo(dAtA[i:]) + n7, err := m.EventTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n9 + i += n7 if m.SchemaURL != nil { dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SchemaURL.Size())) - n10, err := m.SchemaURL.MarshalTo(dAtA[i:]) + n8, err := m.SchemaURL.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n10 + i += n8 } dAtA[i] = 0x42 i++ @@ -1239,16 +1161,6 @@ func (m *EventContext) MarshalTo(dAtA []byte) (int, error) { i += copy(dAtA[i:], v) } } - if m.EscalationPolicy != nil { - dAtA[i] = 0x52 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.EscalationPolicy.Size())) - n11, err := m.EscalationPolicy.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n11 - } return i, nil } @@ -1277,11 +1189,11 @@ func (m *EventDependency) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Filters.Size())) - n12, err := m.Filters.MarshalTo(dAtA[i:]) + n9, err := m.Filters.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n12 + i += n9 dAtA[i] = 0x20 i++ if m.Connected { @@ -1316,31 +1228,31 @@ func (m *EventDependencyFilter) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Time.Size())) - n13, err := m.Time.MarshalTo(dAtA[i:]) + n10, err := m.Time.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n13 + i += n10 } if m.Context != nil { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Context.Size())) - n14, err := m.Context.MarshalTo(dAtA[i:]) + n11, err := m.Context.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n14 + i += n11 } if m.Data != nil { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Data.Size())) - n15, err := m.Data.MarshalTo(dAtA[i:]) + n12, err := m.Data.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n15 + i += n12 } return i, nil } @@ -1367,19 +1279,19 @@ func (m *EventProtocol) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Http.Size())) - n16, err := m.Http.MarshalTo(dAtA[i:]) + n13, err := m.Http.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n16 + i += n13 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Nats.Size())) - n17, err := m.Nats.MarshalTo(dAtA[i:]) + n14, err := m.Nats.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n17 + i += n14 return i, nil } @@ -1565,19 +1477,19 @@ func (m *NodeStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x32 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StartedAt.Size())) - n18, err := m.StartedAt.MarshalTo(dAtA[i:]) + n15, err := m.StartedAt.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n18 + i += n15 dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.CompletedAt.Size())) - n19, err := m.CompletedAt.MarshalTo(dAtA[i:]) + n16, err := m.CompletedAt.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n19 + i += n16 dAtA[i] = 0x42 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Message))) @@ -1586,11 +1498,11 @@ func (m *NodeStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x4a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Event.Size())) - n20, err := m.Event.MarshalTo(dAtA[i:]) + n17, err := m.Event.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n20 + i += n17 } return i, nil } @@ -1651,19 +1563,19 @@ func (m *ResourceObject) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.GroupVersionKind.Size())) - n21, err := m.GroupVersionKind.MarshalTo(dAtA[i:]) + n18, err := m.GroupVersionKind.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n21 + i += n18 dAtA[i] = 0x32 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Source.Size())) - n22, err := m.Source.MarshalTo(dAtA[i:]) + n19, err := m.Source.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n22 + i += n19 return i, nil } @@ -1686,11 +1598,11 @@ func (m *ResourceParameter) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Src.Size())) - n23, err := m.Src.MarshalTo(dAtA[i:]) + n20, err := m.Src.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n23 + i += n20 } dAtA[i] = 0x12 i++ @@ -1776,21 +1688,21 @@ func (m *S3Artifact) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Filter.Size())) - n24, err := m.Filter.MarshalTo(dAtA[i:]) + n21, err := m.Filter.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n24 + i += n21 } if m.S3Bucket != nil { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.S3Bucket.Size())) - n25, err := m.S3Bucket.MarshalTo(dAtA[i:]) + n22, err := m.S3Bucket.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n25 + i += n22 } return i, nil } @@ -1834,21 +1746,21 @@ func (m *S3Bucket) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AccessKey.Size())) - n26, err := m.AccessKey.MarshalTo(dAtA[i:]) + n23, err := m.AccessKey.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n26 + i += n23 } if m.SecretKey != nil { dAtA[i] = 0x32 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretKey.Size())) - n27, err := m.SecretKey.MarshalTo(dAtA[i:]) + n24, err := m.SecretKey.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n27 + i += n24 } return i, nil } @@ -1897,27 +1809,27 @@ func (m *Sensor) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n28, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n25, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n28 + i += n25 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n29, err := m.Spec.MarshalTo(dAtA[i:]) + n26, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n29 + i += n26 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n30, err := m.Status.MarshalTo(dAtA[i:]) + n27, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n30 + i += n27 return i, nil } @@ -1939,11 +1851,11 @@ func (m *SensorList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n31, err := m.ListMeta.MarshalTo(dAtA[i:]) + n28, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n31 + i += n28 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -2002,21 +1914,21 @@ func (m *SensorSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.DeploySpec.Size())) - n32, err := m.DeploySpec.MarshalTo(dAtA[i:]) + n29, err := m.DeploySpec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n32 + i += n29 } if m.EventProtocol != nil { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.EventProtocol.Size())) - n33, err := m.EventProtocol.MarshalTo(dAtA[i:]) + n30, err := m.EventProtocol.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n33 + i += n30 } return i, nil } @@ -2043,19 +1955,19 @@ func (m *SensorStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StartedAt.Size())) - n34, err := m.StartedAt.MarshalTo(dAtA[i:]) + n31, err := m.StartedAt.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n34 + i += n31 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.CompletedAt.Size())) - n35, err := m.CompletedAt.MarshalTo(dAtA[i:]) + n32, err := m.CompletedAt.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n35 + i += n32 dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Message))) @@ -2084,11 +1996,11 @@ func (m *SensorStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n36, err := (&v).MarshalTo(dAtA[i:]) + n33, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n36 + i += n33 } } dAtA[i] = 0x30 @@ -2120,16 +2032,6 @@ func (m *TimeFilter) MarshalTo(dAtA []byte) (int, error) { i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Stop))) i += copy(dAtA[i:], m.Stop) - if m.EscalationPolicy != nil { - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.EscalationPolicy.Size())) - n37, err := m.EscalationPolicy.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n37 - } return i, nil } @@ -2156,11 +2058,11 @@ func (m *Trigger) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Resource.Size())) - n38, err := m.Resource.MarshalTo(dAtA[i:]) + n34, err := m.Resource.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n38 + i += n34 } dAtA[i] = 0x1a i++ @@ -2170,11 +2072,11 @@ func (m *Trigger) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.RetryStrategy.Size())) - n39, err := m.RetryStrategy.MarshalTo(dAtA[i:]) + n35, err := m.RetryStrategy.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n39 + i += n35 } return i, nil } @@ -2323,10 +2225,6 @@ func (m *Data) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } } - if m.EscalationPolicy != nil { - l = m.EscalationPolicy.Size() - n += 1 + l + sovGenerated(uint64(l)) - } return n } @@ -2342,25 +2240,6 @@ func (m *DataFilter) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = len(m.Value) n += 1 + l + sovGenerated(uint64(l)) - if m.EscalationPolicy != nil { - l = m.EscalationPolicy.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - return n -} - -func (m *EscalationPolicy) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Level) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Message) - n += 1 + l + sovGenerated(uint64(l)) return n } @@ -2413,10 +2292,6 @@ func (m *EventContext) Size() (n int) { n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) } } - if m.EscalationPolicy != nil { - l = m.EscalationPolicy.Size() - n += 1 + l + sovGenerated(uint64(l)) - } return n } @@ -2791,10 +2666,6 @@ func (m *TimeFilter) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) l = len(m.Stop) n += 1 + l + sovGenerated(uint64(l)) - if m.EscalationPolicy != nil { - l = m.EscalationPolicy.Size() - n += 1 + l + sovGenerated(uint64(l)) - } return n } @@ -2900,7 +2771,6 @@ func (this *Data) String() string { } s := strings.Join([]string{`&Data{`, `Filters:` + strings.Replace(fmt.Sprintf("%v", this.Filters), "DataFilter", "DataFilter", 1) + `,`, - `EscalationPolicy:` + strings.Replace(fmt.Sprintf("%v", this.EscalationPolicy), "EscalationPolicy", "EscalationPolicy", 1) + `,`, `}`, }, "") return s @@ -2913,19 +2783,6 @@ func (this *DataFilter) String() string { `Path:` + fmt.Sprintf("%v", this.Path) + `,`, `Type:` + fmt.Sprintf("%v", this.Type) + `,`, `Value:` + fmt.Sprintf("%v", this.Value) + `,`, - `EscalationPolicy:` + strings.Replace(fmt.Sprintf("%v", this.EscalationPolicy), "EscalationPolicy", "EscalationPolicy", 1) + `,`, - `}`, - }, "") - return s -} -func (this *EscalationPolicy) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&EscalationPolicy{`, - `Name:` + fmt.Sprintf("%v", this.Name) + `,`, - `Level:` + fmt.Sprintf("%v", this.Level) + `,`, - `Message:` + fmt.Sprintf("%v", this.Message) + `,`, `}`, }, "") return s @@ -2965,7 +2822,6 @@ func (this *EventContext) String() string { `SchemaURL:` + strings.Replace(fmt.Sprintf("%v", this.SchemaURL), "URI", "URI", 1) + `,`, `ContentType:` + fmt.Sprintf("%v", this.ContentType) + `,`, `Extensions:` + mapStringForExtensions + `,`, - `EscalationPolicy:` + strings.Replace(fmt.Sprintf("%v", this.EscalationPolicy), "EscalationPolicy", "EscalationPolicy", 1) + `,`, `}`, }, "") return s @@ -3240,7 +3096,6 @@ func (this *TimeFilter) String() string { s := strings.Join([]string{`&TimeFilter{`, `Start:` + fmt.Sprintf("%v", this.Start) + `,`, `Stop:` + fmt.Sprintf("%v", this.Stop) + `,`, - `EscalationPolicy:` + strings.Replace(fmt.Sprintf("%v", this.EscalationPolicy), "EscalationPolicy", "EscalationPolicy", 1) + `,`, `}`, }, "") return s @@ -3703,39 +3558,6 @@ func (m *Data) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EscalationPolicy", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.EscalationPolicy == nil { - m.EscalationPolicy = &EscalationPolicy{} - } - if err := m.EscalationPolicy.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -3873,176 +3695,6 @@ func (m *DataFilter) Unmarshal(dAtA []byte) error { } m.Value = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EscalationPolicy", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.EscalationPolicy == nil { - m.EscalationPolicy = &EscalationPolicy{} - } - if err := m.EscalationPolicy.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *EscalationPolicy) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: EscalationPolicy: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EscalationPolicy: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Level", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Level = EscalationLevel(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Message = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -4563,39 +4215,6 @@ func (m *EventContext) Unmarshal(dAtA []byte) error { } m.Extensions[mapkey] = mapvalue iNdEx = postIndex - case 10: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EscalationPolicy", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.EscalationPolicy == nil { - m.EscalationPolicy = &EscalationPolicy{} - } - if err := m.EscalationPolicy.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -4999,7 +4618,7 @@ func (m *EventProtocol) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Type = EventProtocolType(dAtA[iNdEx:postIndex]) + m.Type = github_com_argoproj_argo_events_common.EventProtocolType(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { @@ -5667,7 +5286,7 @@ func (m *Nats) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Type = NatsType(dAtA[iNdEx:postIndex]) + m.Type = github_com_argoproj_argo_events_common.NatsType(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -7926,39 +7545,6 @@ func (m *TimeFilter) Unmarshal(dAtA []byte) error { } m.Stop = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EscalationPolicy", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.EscalationPolicy == nil { - m.EscalationPolicy = &EscalationPolicy{} - } - if err := m.EscalationPolicy.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -8631,177 +8217,172 @@ var ( ) func init() { - proto.RegisterFile("github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1/generated.proto", fileDescriptor_generated_558b4bfc5fa3d402) -} - -var fileDescriptor_generated_558b4bfc5fa3d402 = []byte{ - // 2687 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5a, 0x5f, 0x6f, 0x1b, 0xc7, - 0x11, 0xf7, 0xf1, 0x9f, 0xc8, 0x91, 0x1c, 0xc9, 0x9b, 0x04, 0x21, 0x14, 0x44, 0x74, 0x2f, 0x68, - 0x90, 0x16, 0x09, 0x99, 0x58, 0x75, 0xe0, 0x16, 0x48, 0x1b, 0x51, 0x94, 0x63, 0x59, 0xb2, 0x2c, - 0x2f, 0x63, 0x17, 0x70, 0x03, 0xd4, 0xa7, 0xbb, 0x25, 0x75, 0xd6, 0xf1, 0xee, 0x7c, 0xbb, 0x64, - 0xcd, 0xa2, 0x68, 0xd3, 0xb4, 0x7d, 0x09, 0x8a, 0xc2, 0x6f, 0x7d, 0xe8, 0x63, 0xbf, 0x43, 0xd1, - 0xb7, 0xa2, 0x7d, 0xf2, 0x4b, 0x81, 0x14, 0x05, 0x8a, 0xf4, 0x85, 0xa8, 0x59, 0xa0, 0x0f, 0xfd, - 0x08, 0x7e, 0x2a, 0xf6, 0xcf, 0xed, 0x1d, 0x8f, 0x54, 0x2d, 0x8b, 0x02, 0xfc, 0x92, 0xf0, 0x66, - 0x66, 0x67, 0x66, 0x67, 0x77, 0x67, 0x7e, 0x33, 0x32, 0x5c, 0xeb, 0xba, 0xec, 0xb0, 0x7f, 0x50, - 0xb7, 0x83, 0x5e, 0xc3, 0x8a, 0xba, 0x41, 0x18, 0x05, 0xf7, 0xc5, 0x8f, 0x77, 0xc9, 0x80, 0xf8, - 0x8c, 0x36, 0xc2, 0xa3, 0x6e, 0xc3, 0x0a, 0x5d, 0xda, 0xa0, 0xc4, 0xa7, 0x41, 0xd4, 0x18, 0xbc, - 0x6f, 0x79, 0xe1, 0xa1, 0xf5, 0x7e, 0xa3, 0x4b, 0x7c, 0x12, 0x59, 0x8c, 0x38, 0xf5, 0x30, 0x0a, - 0x58, 0x80, 0xae, 0x24, 0x9a, 0xea, 0xb1, 0x26, 0xf1, 0xe3, 0x87, 0x52, 0x53, 0x3d, 0x3c, 0xea, - 0xd6, 0xb9, 0xa6, 0xba, 0xd4, 0x54, 0x8f, 0x35, 0xad, 0xbe, 0x9b, 0xf2, 0xa1, 0x1b, 0x74, 0x83, - 0x86, 0x50, 0x78, 0xd0, 0xef, 0x88, 0x2f, 0xf1, 0x21, 0x7e, 0x49, 0x43, 0xab, 0xe6, 0xd1, 0x15, - 0x5a, 0x77, 0x03, 0xee, 0x55, 0xc3, 0x0e, 0x22, 0xd2, 0x18, 0x4c, 0x39, 0xb3, 0xfa, 0xad, 0x44, - 0xa6, 0x67, 0xd9, 0x87, 0xae, 0x4f, 0xa2, 0x61, 0xb2, 0x95, 0x1e, 0x61, 0xd6, 0xac, 0x55, 0x8d, - 0xe3, 0x56, 0x45, 0x7d, 0x9f, 0xb9, 0x3d, 0x32, 0xb5, 0xe0, 0x83, 0x67, 0x2d, 0xa0, 0xf6, 0x21, - 0xe9, 0x59, 0x53, 0xeb, 0xd6, 0x8f, 0x5b, 0xd7, 0x67, 0xae, 0xd7, 0x70, 0x7d, 0x46, 0x59, 0x94, - 0x5d, 0x64, 0xfe, 0x23, 0x0f, 0x2b, 0x1b, 0x11, 0x73, 0x3b, 0x96, 0xcd, 0x76, 0x03, 0xdb, 0x62, - 0x6e, 0xe0, 0xa3, 0x4f, 0x21, 0x47, 0xd7, 0xab, 0xc6, 0x45, 0xe3, 0xed, 0xc5, 0x4b, 0xad, 0xfa, - 0x69, 0x8f, 0xa0, 0xde, 0x5e, 0x8f, 0x35, 0x37, 0x4b, 0xe3, 0x51, 0x2d, 0xd7, 0x5e, 0xc7, 0x39, - 0xba, 0x8e, 0x4c, 0x28, 0xb9, 0xbe, 0xe7, 0xfa, 0xa4, 0x9a, 0xbb, 0x68, 0xbc, 0x5d, 0x69, 0xc2, - 0x78, 0x54, 0x2b, 0x6d, 0x0b, 0x0a, 0x56, 0x1c, 0xe4, 0x40, 0xa1, 0xe3, 0x7a, 0xa4, 0x9a, 0x17, - 0x3e, 0x5c, 0x3d, 0xbd, 0x0f, 0x57, 0x5d, 0x8f, 0x68, 0x2f, 0xca, 0xe3, 0x51, 0xad, 0xc0, 0x29, - 0x58, 0x68, 0x47, 0xf7, 0x20, 0xdf, 0x8f, 0xbc, 0x6a, 0x41, 0x18, 0xd9, 0x3a, 0xbd, 0x91, 0xdb, - 0x78, 0x57, 0xdb, 0x58, 0x18, 0x8f, 0x6a, 0xf9, 0xdb, 0x78, 0x17, 0x73, 0xd5, 0xe8, 0x21, 0x54, - 0xec, 0xc0, 0xef, 0xb8, 0xdd, 0x9e, 0x15, 0x56, 0x8b, 0xc2, 0xce, 0xce, 0xe9, 0xed, 0x6c, 0xc6, - 0xaa, 0xb4, 0xb5, 0xf3, 0xe3, 0x51, 0xad, 0xa2, 0xc9, 0x38, 0x31, 0x66, 0xfe, 0xca, 0x80, 0x0b, - 0x53, 0xf2, 0xe8, 0x22, 0x14, 0x7c, 0xab, 0x47, 0xc4, 0xd9, 0x56, 0x9a, 0x4b, 0x8f, 0x47, 0xb5, - 0x73, 0x3c, 0x26, 0x7b, 0x56, 0x8f, 0x60, 0xc1, 0x41, 0x0d, 0xa8, 0xf0, 0xff, 0xd3, 0xd0, 0xb2, - 0xe3, 0x03, 0xba, 0xa0, 0xc4, 0x2a, 0x7b, 0x31, 0x03, 0x27, 0x32, 0xe8, 0x0d, 0xc8, 0x1f, 0x91, - 0xa1, 0x38, 0xa9, 0x4a, 0x73, 0x51, 0x89, 0xe6, 0x77, 0xc8, 0x10, 0x73, 0xba, 0xf9, 0x79, 0x0e, - 0x0a, 0x2d, 0x8b, 0x59, 0xe8, 0x08, 0x16, 0x3a, 0xae, 0xc7, 0x48, 0x44, 0xab, 0xc6, 0xc5, 0xfc, - 0x7c, 0x37, 0x8b, 0x2b, 0xbc, 0x2a, 0x94, 0x35, 0x17, 0xc7, 0xa3, 0xda, 0x82, 0xfc, 0x4d, 0x71, - 0x6c, 0x01, 0xfd, 0xda, 0x80, 0x15, 0x42, 0x6d, 0xcb, 0x13, 0x17, 0x7a, 0x3f, 0xf0, 0x5c, 0x7b, - 0x28, 0x76, 0xb3, 0x78, 0xe9, 0xfa, 0xe9, 0xcd, 0x6e, 0x65, 0x34, 0x36, 0x5f, 0x19, 0x8f, 0x6a, - 0x2b, 0x59, 0x2a, 0x9e, 0xb2, 0x6c, 0x3e, 0xca, 0x01, 0x24, 0x3e, 0xf3, 0x53, 0x08, 0x2d, 0x76, - 0x98, 0x3d, 0x85, 0x7d, 0x8b, 0x1d, 0x62, 0xc1, 0x41, 0xef, 0x40, 0x81, 0x0d, 0xc3, 0xf8, 0x00, - 0xaa, 0xb1, 0xc4, 0x27, 0xc3, 0x90, 0x3c, 0x1d, 0xd5, 0xca, 0xd7, 0xdb, 0x37, 0xf7, 0xf8, 0x6f, - 0x2c, 0xa4, 0xd0, 0x9b, 0x50, 0x1c, 0x58, 0x5e, 0x9f, 0xa8, 0x43, 0x38, 0xaf, 0xc4, 0x8b, 0x77, - 0x38, 0x11, 0x4b, 0xde, 0xec, 0x90, 0x14, 0x5e, 0x58, 0x48, 0x7e, 0x6b, 0xc0, 0x94, 0xd8, 0x09, - 0xae, 0xe7, 0x07, 0x50, 0xf4, 0xc8, 0x80, 0x78, 0x2a, 0x32, 0x17, 0xe3, 0xad, 0xee, 0x72, 0xe2, - 0xd3, 0x51, 0x6d, 0x39, 0xd1, 0x29, 0x48, 0x58, 0x8a, 0xa3, 0x6f, 0xc0, 0x42, 0x8f, 0x50, 0x6a, - 0x75, 0xe3, 0x20, 0x2d, 0xab, 0x95, 0x0b, 0x37, 0x24, 0x19, 0xc7, 0x7c, 0xf3, 0x77, 0x06, 0x14, - 0xb7, 0xf8, 0xb6, 0xd1, 0x03, 0x58, 0xb0, 0x03, 0x9f, 0x91, 0x87, 0x4c, 0x25, 0xc3, 0x39, 0x12, - 0x91, 0xd0, 0xb8, 0x29, 0xb5, 0x25, 0xc6, 0x15, 0x01, 0xc7, 0x76, 0x50, 0x0d, 0x0a, 0x8e, 0xc5, - 0x2c, 0xb1, 0xbd, 0x25, 0x79, 0xb9, 0xf7, 0xad, 0xa1, 0x17, 0x58, 0x0e, 0x16, 0x0c, 0xf3, 0x4f, - 0x0b, 0xb0, 0x94, 0xd6, 0xc5, 0x1f, 0xac, 0xb0, 0xcd, 0xef, 0x83, 0x0a, 0x9c, 0x7e, 0xb0, 0x5b, - 0x31, 0x03, 0x27, 0x32, 0xa8, 0x05, 0x2b, 0xfa, 0xe3, 0x0e, 0x89, 0xa8, 0x1b, 0xf8, 0x99, 0x7b, - 0xb6, 0xb2, 0x95, 0xe1, 0xe3, 0xa9, 0x15, 0xe8, 0x3a, 0x20, 0xdb, 0x0b, 0xfa, 0x8e, 0x10, 0xa5, - 0xb1, 0x1e, 0x19, 0xdb, 0x55, 0xa5, 0x07, 0x6d, 0x4e, 0x49, 0xe0, 0x19, 0xab, 0x90, 0x05, 0x25, - 0x1a, 0xf4, 0x23, 0x9b, 0xa8, 0xfb, 0xf8, 0xe1, 0x3c, 0xa9, 0x78, 0x5b, 0x16, 0x94, 0xb6, 0x50, - 0x88, 0x95, 0x62, 0x7e, 0xfe, 0x62, 0xe9, 0x76, 0x4b, 0xa4, 0xe1, 0xd4, 0xf9, 0x6f, 0x49, 0x32, - 0x8e, 0xf9, 0xe8, 0x5e, 0x1c, 0x50, 0xb7, 0x47, 0xaa, 0x25, 0xe1, 0x50, 0xa3, 0x2e, 0x6b, 0x6b, - 0x3d, 0x5d, 0x5b, 0x13, 0x27, 0x78, 0xe9, 0xaf, 0x0f, 0xde, 0xaf, 0xdf, 0x70, 0xed, 0x28, 0xe0, - 0xcb, 0xb2, 0x27, 0xe0, 0xf6, 0xf4, 0x09, 0xb8, 0x3d, 0x82, 0xee, 0x43, 0x45, 0xd6, 0xf0, 0xdb, - 0x78, 0xb7, 0xba, 0x70, 0x16, 0x5b, 0x16, 0x75, 0xa0, 0x1d, 0xeb, 0xc4, 0x89, 0x7a, 0x74, 0x19, - 0x16, 0xc5, 0xdd, 0x52, 0x17, 0xa4, 0x2c, 0x36, 0xff, 0xb2, 0x72, 0x6f, 0x71, 0x33, 0x61, 0xe1, - 0xb4, 0x1c, 0xfa, 0xc2, 0x00, 0x20, 0x0f, 0x19, 0xf1, 0xf9, 0x01, 0xd1, 0x6a, 0x45, 0x64, 0xec, - 0x3b, 0x67, 0x73, 0xfd, 0xeb, 0x5b, 0x5a, 0xf1, 0x96, 0xcf, 0xa2, 0x61, 0x13, 0x29, 0x77, 0x20, - 0x61, 0xe0, 0x94, 0xf5, 0xd9, 0xa9, 0x0b, 0x5e, 0x54, 0xea, 0x5a, 0xfd, 0x10, 0x96, 0x33, 0x3b, - 0x40, 0x2b, 0xb2, 0x08, 0x8a, 0xe7, 0x27, 0xea, 0x1e, 0x7a, 0x25, 0xce, 0xc9, 0xe2, 0x69, 0xa9, - 0x24, 0xfc, 0x9d, 0xdc, 0x15, 0xc3, 0xfc, 0x4d, 0x0e, 0x96, 0x45, 0x38, 0x5a, 0x24, 0x24, 0xbe, - 0x43, 0xfc, 0x13, 0x25, 0xbe, 0x77, 0xa0, 0xec, 0x10, 0xcb, 0xd1, 0xb8, 0x29, 0xdf, 0x5c, 0x51, - 0x52, 0xe5, 0x96, 0xa2, 0x63, 0x2d, 0x81, 0x7e, 0x9c, 0x14, 0x5b, 0x09, 0xa1, 0x6e, 0xce, 0x79, - 0x74, 0x89, 0xaf, 0xaa, 0xee, 0xea, 0xf7, 0x33, 0x55, 0x7b, 0x1b, 0x02, 0xf3, 0xf8, 0xc4, 0x66, - 0xc4, 0x11, 0x0f, 0xba, 0x9c, 0x3c, 0x87, 0xcd, 0x98, 0x81, 0x13, 0x19, 0xf3, 0xbf, 0x39, 0x78, - 0x75, 0xa6, 0x91, 0x13, 0x84, 0xe5, 0x00, 0x0a, 0x1c, 0x13, 0xab, 0xda, 0x3e, 0x07, 0xa4, 0xe0, - 0x0f, 0x53, 0x6d, 0x4d, 0xc0, 0x44, 0xf1, 0x66, 0x85, 0x6e, 0xd4, 0x4b, 0xca, 0x40, 0xfe, 0x4c, - 0xcb, 0xc0, 0xe2, 0xcc, 0x12, 0xf0, 0xa9, 0x2a, 0x01, 0x32, 0x17, 0x7e, 0x77, 0x3e, 0x94, 0x24, - 0x37, 0xc3, 0x7f, 0xa9, 0xfa, 0xf1, 0x45, 0x0e, 0xce, 0x0b, 0x27, 0xf6, 0x39, 0xfe, 0xb7, 0x03, - 0x0f, 0x5d, 0x56, 0x58, 0x43, 0x06, 0xf9, 0x6b, 0x19, 0xac, 0x71, 0x61, 0x42, 0x38, 0x05, 0x3a, - 0xee, 0x41, 0xe1, 0x90, 0xb1, 0x50, 0x45, 0x7e, 0x0e, 0x37, 0xaf, 0x31, 0x16, 0x26, 0x67, 0xcb, - 0xbf, 0xb0, 0xd0, 0xcc, 0x2d, 0xf8, 0x16, 0x8b, 0x6f, 0xf0, 0x1c, 0x16, 0xf6, 0x2c, 0x46, 0xd3, - 0xb7, 0x87, 0x51, 0x2c, 0x34, 0x9b, 0xef, 0xc1, 0x52, 0xba, 0x41, 0x78, 0x36, 0x30, 0x33, 0x7f, - 0x69, 0xc0, 0xca, 0xc7, 0x51, 0xd0, 0x0f, 0x55, 0xed, 0xda, 0x71, 0x7d, 0x87, 0xe3, 0xaf, 0x2e, - 0xa7, 0xa9, 0x75, 0x1a, 0x7f, 0x09, 0x41, 0x2c, 0x79, 0xbc, 0x02, 0x0d, 0x26, 0xaa, 0xad, 0x7e, - 0x41, 0x71, 0x69, 0x8c, 0xf9, 0xdc, 0x8d, 0x23, 0xd7, 0x77, 0x54, 0x35, 0xd5, 0x6e, 0x70, 0x5b, - 0x58, 0x70, 0xcc, 0xb7, 0x41, 0x04, 0x4a, 0x38, 0x1c, 0x44, 0x6c, 0xca, 0xe1, 0x20, 0x62, 0x58, - 0x70, 0xcc, 0x3f, 0x17, 0x40, 0xec, 0x98, 0xe3, 0x74, 0xde, 0xec, 0x18, 0x93, 0x38, 0x5d, 0x77, - 0x2a, 0x6d, 0x78, 0x95, 0x32, 0x2b, 0x62, 0xdf, 0x77, 0xd9, 0xe1, 0xae, 0x45, 0x19, 0x26, 0x36, - 0x71, 0x07, 0xc4, 0x11, 0xce, 0x96, 0x9b, 0x6f, 0xa8, 0x05, 0xaf, 0xb6, 0x67, 0x09, 0xe1, 0xd9, - 0x6b, 0xd1, 0x0d, 0x78, 0xd9, 0x21, 0x9e, 0x3b, 0x20, 0xd1, 0x86, 0xe7, 0x6d, 0x0c, 0x2c, 0xd7, - 0xb3, 0x0e, 0x54, 0x57, 0x57, 0x6e, 0xbe, 0xae, 0x54, 0xbe, 0xdc, 0x9a, 0x16, 0xc1, 0xb3, 0xd6, - 0xa1, 0x0d, 0x58, 0x16, 0x76, 0x36, 0x58, 0x9b, 0x3c, 0xe8, 0x13, 0x5f, 0x01, 0x86, 0x4a, 0xf3, - 0x35, 0xa5, 0x6a, 0xb9, 0x3d, 0xc9, 0xc6, 0x59, 0x79, 0x5e, 0x0e, 0x15, 0x49, 0x94, 0xf7, 0xe2, - 0x64, 0x39, 0x6c, 0x27, 0x2c, 0x9c, 0x96, 0xe3, 0x98, 0x29, 0xf5, 0xd9, 0x22, 0x1e, 0xb3, 0x04, - 0x34, 0x48, 0x61, 0xa6, 0x76, 0x86, 0x8f, 0xa7, 0x56, 0xf0, 0x2b, 0xe0, 0xf4, 0x23, 0x11, 0x82, - 0x05, 0x11, 0x02, 0x7d, 0x05, 0x5a, 0x92, 0x8c, 0x63, 0xbe, 0x48, 0xa2, 0x5e, 0x9f, 0x32, 0x12, - 0x6d, 0x3b, 0xaa, 0x68, 0x27, 0x49, 0x34, 0x66, 0xe0, 0x44, 0x86, 0xd7, 0x07, 0xdb, 0x73, 0x39, - 0x82, 0x71, 0xaa, 0x15, 0x21, 0xaf, 0xeb, 0xc3, 0xa6, 0xa2, 0x63, 0x2d, 0xa1, 0xfb, 0x0b, 0x98, - 0xdd, 0x5f, 0xf0, 0x0b, 0x93, 0x3c, 0x75, 0xf3, 0x8f, 0x05, 0x80, 0xbd, 0xc0, 0x21, 0x6d, 0x66, - 0xb1, 0x3e, 0x45, 0xab, 0x90, 0x73, 0x1d, 0x75, 0x91, 0x40, 0x2d, 0xcd, 0x6d, 0xb7, 0x70, 0xce, - 0x75, 0x74, 0xc6, 0xce, 0x1d, 0x9b, 0xb1, 0x2f, 0xc3, 0xa2, 0xe3, 0xd2, 0xd0, 0xb3, 0x86, 0x9c, - 0xa8, 0xee, 0xb8, 0x3e, 0x81, 0x56, 0xc2, 0xc2, 0x69, 0x39, 0xed, 0x71, 0xe1, 0x18, 0x8f, 0x03, - 0x87, 0xa4, 0x92, 0xd3, 0x7b, 0x50, 0x0c, 0x0f, 0x2d, 0x1a, 0x1f, 0x70, 0x0c, 0x48, 0x8b, 0xfb, - 0x9c, 0xf8, 0x94, 0xb7, 0xb2, 0x81, 0x43, 0xc4, 0x07, 0x96, 0x82, 0x1c, 0xf5, 0x89, 0xf3, 0x22, - 0xce, 0x06, 0x9b, 0x1b, 0xf5, 0xb5, 0x63, 0x4d, 0x38, 0x51, 0x8a, 0x3a, 0x1c, 0x89, 0xf5, 0x42, - 0x8f, 0x48, 0x1b, 0x0b, 0xa7, 0xb3, 0x91, 0x82, 0x6e, 0x5a, 0x17, 0x4e, 0x2b, 0x4e, 0xb7, 0x3a, - 0xe5, 0xff, 0xdf, 0xea, 0xa0, 0x7b, 0x50, 0x14, 0xb9, 0x53, 0xdc, 0x98, 0xc5, 0x4b, 0xdf, 0x9b, - 0xb3, 0xae, 0x35, 0x2b, 0x3c, 0xc6, 0xe2, 0x27, 0x96, 0x8a, 0xcd, 0xcf, 0x8b, 0xf0, 0x12, 0x26, - 0x12, 0x84, 0xdf, 0x3c, 0xb8, 0x4f, 0x6c, 0x36, 0x39, 0x61, 0x30, 0x4e, 0x30, 0x61, 0xf8, 0x09, - 0x94, 0x3c, 0xeb, 0x80, 0x78, 0xbc, 0x12, 0x70, 0x18, 0xfa, 0xc9, 0xe9, 0xdd, 0x9c, 0x74, 0xa5, - 0xbe, 0x2b, 0xd4, 0x4a, 0x10, 0xfa, 0x92, 0xf2, 0xa1, 0x24, 0x89, 0x58, 0xd9, 0x44, 0x3f, 0x03, - 0x08, 0xad, 0xc8, 0xea, 0x11, 0x81, 0xa6, 0x0a, 0xc2, 0x83, 0x9d, 0xf9, 0x3d, 0xd8, 0x8f, 0x75, - 0x26, 0xe8, 0x57, 0x93, 0x28, 0x4e, 0x99, 0x44, 0x8f, 0x0c, 0x58, 0xe9, 0x66, 0x4a, 0x8e, 0x9a, - 0x25, 0xcd, 0x81, 0x7e, 0xb3, 0x45, 0x2c, 0x49, 0x64, 0x59, 0x0e, 0x9e, 0xb2, 0x8e, 0x22, 0xdd, - 0xb0, 0x95, 0xe6, 0xf5, 0x23, 0x3b, 0x7c, 0x4c, 0xce, 0x61, 0xb2, 0x83, 0x5b, 0xfd, 0x36, 0x2c, - 0xa6, 0x8e, 0xeb, 0xb9, 0x10, 0xf7, 0xef, 0x0d, 0xb8, 0x30, 0x15, 0x77, 0xe4, 0x41, 0x9e, 0x46, - 0xb6, 0xea, 0xec, 0x6f, 0x9d, 0xe1, 0x89, 0x4a, 0xc7, 0xe5, 0x24, 0xb0, 0x1d, 0xd9, 0x98, 0x9b, - 0xe1, 0x89, 0xd1, 0x21, 0x94, 0x65, 0x13, 0x63, 0x8b, 0x50, 0x86, 0x05, 0xc7, 0xfc, 0xb9, 0x01, - 0xaf, 0x1d, 0xa3, 0x8b, 0x23, 0x0c, 0xf9, 0x50, 0x33, 0x08, 0x23, 0xfd, 0xd6, 0x34, 0x7a, 0xc9, - 0x1d, 0x3b, 0x56, 0xaa, 0x4d, 0x0e, 0x8a, 0x2a, 0xd9, 0x21, 0x91, 0xb9, 0x0c, 0xe7, 0x31, 0x61, - 0xd1, 0xb0, 0xcd, 0x22, 0x8b, 0x91, 0xee, 0xd0, 0xfc, 0x67, 0x0e, 0x20, 0x99, 0xe3, 0xc6, 0xc3, - 0x3e, 0x63, 0xf6, 0xb0, 0x0f, 0xdd, 0x89, 0xdd, 0x94, 0x2e, 0x7c, 0x34, 0xe1, 0xe6, 0xd3, 0x51, - 0xad, 0x91, 0x1a, 0xca, 0xf7, 0x5c, 0xdf, 0x0d, 0xe4, 0x7f, 0xdf, 0xed, 0x06, 0xf5, 0xbd, 0x80, - 0xb9, 0x1d, 0x57, 0xde, 0x81, 0x64, 0x6c, 0xa1, 0x76, 0xd6, 0x81, 0x92, 0xec, 0x2e, 0x14, 0x16, - 0x6c, 0xce, 0x33, 0x94, 0x56, 0x28, 0x5f, 0x4c, 0x09, 0xe4, 0x6f, 0xac, 0xb4, 0x23, 0x0f, 0xca, - 0x74, 0xbd, 0xd9, 0xb7, 0x8f, 0x08, 0x53, 0xf0, 0x7b, 0x2e, 0x4b, 0x52, 0x53, 0x73, 0x89, 0x17, - 0xe1, 0xf8, 0x0b, 0x6b, 0x0b, 0xe6, 0x28, 0x07, 0x9a, 0xcc, 0xeb, 0x37, 0xf1, 0x9d, 0x30, 0x70, - 0xf5, 0x21, 0xeb, 0xfa, 0xbd, 0xa5, 0xe8, 0x58, 0x4b, 0xa0, 0xb7, 0xa0, 0x74, 0x20, 0xdd, 0x94, - 0x91, 0xd6, 0x8f, 0x46, 0x19, 0x51, 0x5c, 0x2e, 0x17, 0x91, 0x6e, 0x32, 0x99, 0xd1, 0x72, 0x58, - 0x50, 0xb1, 0xe2, 0x72, 0xeb, 0xae, 0x4f, 0x89, 0xdd, 0x8f, 0x88, 0x6a, 0xd9, 0xb4, 0xf5, 0x6d, - 0x45, 0xc7, 0x5a, 0x02, 0x61, 0xa8, 0x58, 0xb6, 0x4d, 0x28, 0xdd, 0x21, 0x43, 0x95, 0x89, 0xbe, - 0x9e, 0xaa, 0x63, 0x75, 0x3b, 0x88, 0x08, 0xaf, 0x5a, 0x6d, 0x62, 0x47, 0x84, 0xed, 0x90, 0x61, - 0x9b, 0x78, 0xc4, 0x66, 0x41, 0x24, 0xe7, 0x14, 0x1b, 0xf1, 0x5a, 0x9c, 0xa8, 0xe1, 0x3a, 0x69, - 0x2c, 0xae, 0xb2, 0xca, 0xf3, 0xe8, 0xd4, 0x64, 0x9c, 0xa8, 0x31, 0xef, 0xf2, 0xf8, 0xaa, 0x56, - 0xf2, 0x2d, 0x28, 0x85, 0x11, 0xe9, 0xb8, 0x0f, 0x55, 0x74, 0x75, 0x24, 0xf6, 0x05, 0x15, 0x2b, - 0x2e, 0x97, 0xa3, 0xfd, 0x0e, 0x97, 0xcb, 0x44, 0xb6, 0x2d, 0xa8, 0x58, 0x71, 0xcd, 0xbf, 0xe4, - 0xa0, 0xd4, 0x16, 0x27, 0x8e, 0xee, 0x41, 0x99, 0xd7, 0x69, 0xd1, 0xb4, 0xc9, 0x6c, 0xf2, 0xde, - 0xc9, 0xaa, 0xba, 0xac, 0x42, 0x37, 0x08, 0xb3, 0x92, 0x22, 0x90, 0xd0, 0xb0, 0xd6, 0x8a, 0x3a, - 0x50, 0xa0, 0x21, 0xb1, 0xe7, 0xef, 0x72, 0xa5, 0xc7, 0xed, 0x90, 0xd8, 0x49, 0x7e, 0xe0, 0x5f, - 0x58, 0xe8, 0x47, 0x3e, 0x94, 0xa8, 0xc0, 0x78, 0xf3, 0x37, 0xba, 0xca, 0x92, 0xd0, 0x96, 0x0a, - 0xa2, 0xf8, 0xc6, 0xca, 0x8a, 0xf9, 0x37, 0x03, 0x40, 0x0a, 0xee, 0xba, 0x94, 0x77, 0xbe, 0xd9, - 0x40, 0xd6, 0x4f, 0x16, 0x48, 0xbe, 0x5a, 0x84, 0x51, 0xdf, 0xda, 0x98, 0x92, 0x0a, 0x22, 0x81, - 0xa2, 0xcb, 0x48, 0x8f, 0x56, 0x73, 0xa2, 0x86, 0x7f, 0x34, 0xef, 0xde, 0x92, 0x2c, 0xbc, 0xcd, - 0xd5, 0x62, 0xa9, 0xdd, 0xfc, 0x7b, 0x3e, 0xde, 0x13, 0x0f, 0x2c, 0xfa, 0x85, 0x01, 0x4b, 0x4e, - 0x3c, 0xd7, 0x70, 0x49, 0xfc, 0xc7, 0x8f, 0xed, 0x33, 0x9b, 0xc7, 0x34, 0x5f, 0x51, 0x6e, 0x2c, - 0xb5, 0x52, 0x66, 0xf0, 0x84, 0x51, 0x14, 0x40, 0x99, 0x45, 0x6e, 0xb7, 0xcb, 0x21, 0x8c, 0xdc, - 0xfe, 0xc6, 0x1c, 0xa3, 0x12, 0xa9, 0x29, 0x09, 0xb6, 0x22, 0x50, 0xac, 0x8d, 0xa0, 0x1d, 0x00, - 0x87, 0x84, 0x5e, 0x30, 0xe4, 0x41, 0x50, 0xb7, 0xe9, 0xf5, 0x59, 0xef, 0x79, 0x3f, 0x70, 0xc4, - 0x75, 0x7c, 0x89, 0x5f, 0xfe, 0x96, 0x5e, 0x82, 0x53, 0xcb, 0xd1, 0x67, 0x06, 0x9c, 0x27, 0xe9, - 0x31, 0x84, 0x4a, 0xce, 0x1f, 0xcf, 0x19, 0xc4, 0x58, 0x5d, 0xf3, 0xc2, 0x78, 0x54, 0x9b, 0x9c, - 0x8a, 0xe0, 0x49, 0x83, 0xe6, 0x7f, 0x0a, 0xb0, 0x94, 0xbe, 0xd2, 0x49, 0x87, 0x61, 0x9c, 0xb4, - 0xc3, 0xf8, 0x41, 0xba, 0xc3, 0x90, 0x2f, 0xf9, 0x9b, 0x27, 0xbb, 0xde, 0x27, 0x68, 0x2e, 0xac, - 0xc9, 0xe6, 0x22, 0xff, 0xdc, 0xea, 0x9f, 0xab, 0xaf, 0x28, 0x3c, 0xa3, 0xaf, 0x18, 0x40, 0xd1, - 0x0f, 0x1c, 0x42, 0xab, 0x45, 0x71, 0xd7, 0x6e, 0x9d, 0x4d, 0x1a, 0xa9, 0xf3, 0x90, 0x2a, 0xb4, - 0xae, 0xdf, 0x9e, 0xa0, 0x61, 0x69, 0x0e, 0x6d, 0xc0, 0xb2, 0xf2, 0xd8, 0x0d, 0xfc, 0xcd, 0xa0, - 0xef, 0xcb, 0x56, 0xae, 0x98, 0x0c, 0x08, 0x36, 0x27, 0xd9, 0x38, 0x2b, 0xbf, 0xfa, 0x53, 0xd9, - 0xea, 0x1e, 0x8b, 0x32, 0xef, 0xa6, 0x51, 0xe6, 0x5c, 0xb9, 0x38, 0xe9, 0xa8, 0xd3, 0x58, 0x75, - 0x6c, 0x00, 0x24, 0xb3, 0x48, 0x0e, 0xfc, 0xc4, 0x21, 0x67, 0x81, 0x9f, 0xb8, 0x04, 0x58, 0xf2, - 0x38, 0xf0, 0xa3, 0x2c, 0x08, 0xb3, 0xc0, 0xaf, 0xcd, 0x82, 0x10, 0x0b, 0xce, 0xec, 0x09, 0x7a, - 0xfe, 0x85, 0xfd, 0xf1, 0xef, 0xaf, 0x39, 0x58, 0x50, 0x49, 0xe3, 0x04, 0x33, 0xde, 0x08, 0xca, - 0x91, 0xc2, 0xc5, 0x2a, 0xea, 0xd7, 0xce, 0xaa, 0x03, 0x94, 0xd8, 0x2c, 0xa6, 0x61, 0x6d, 0xe7, - 0x39, 0xfe, 0x5e, 0x28, 0xb2, 0x53, 0x44, 0x42, 0x4f, 0x83, 0xe6, 0xf9, 0xb3, 0xd3, 0x04, 0x06, - 0x97, 0xd9, 0x69, 0x82, 0x84, 0x27, 0x0d, 0x9a, 0x7f, 0xc8, 0x41, 0xfe, 0x36, 0xde, 0x16, 0xe0, - 0xc5, 0x3e, 0x24, 0x3a, 0x9a, 0x49, 0xdd, 0x15, 0x54, 0xac, 0xb8, 0x3c, 0xe6, 0x7d, 0x4a, 0xa2, - 0xec, 0x85, 0xb9, 0x4d, 0x49, 0x84, 0x05, 0x87, 0x03, 0xc2, 0xd0, 0xa2, 0xf4, 0x47, 0x41, 0x14, - 0x8f, 0x21, 0x75, 0xb6, 0xdf, 0x57, 0x74, 0xac, 0x25, 0xb8, 0xbe, 0xc3, 0x80, 0x32, 0x95, 0x17, - 0x92, 0x59, 0x6e, 0xc0, 0x9b, 0x1b, 0xce, 0xd1, 0x83, 0xca, 0xa2, 0x78, 0x8e, 0x33, 0x06, 0x95, - 0xba, 0x7b, 0x29, 0x1d, 0xdb, 0xbd, 0xbc, 0x09, 0xc5, 0x07, 0x7d, 0x12, 0x0d, 0xc5, 0xe8, 0x24, - 0xf5, 0x16, 0x6e, 0x71, 0x22, 0x96, 0x3c, 0xee, 0x78, 0x27, 0xb2, 0xba, 0x3d, 0xde, 0x85, 0x94, - 0x27, 0x1d, 0xbf, 0xaa, 0xe8, 0x58, 0x4b, 0x98, 0x36, 0x2c, 0xa6, 0xfe, 0xf1, 0xc6, 0x09, 0xfe, - 0x30, 0x7f, 0x09, 0x60, 0x40, 0x22, 0xb7, 0x33, 0xdc, 0x24, 0x11, 0x53, 0xb3, 0x51, 0x8d, 0xdd, - 0xee, 0x68, 0x0e, 0x4e, 0x49, 0x35, 0xeb, 0x8f, 0x9f, 0xac, 0x9d, 0xfb, 0xf2, 0xc9, 0xda, 0xb9, - 0xaf, 0x9e, 0xac, 0x9d, 0xfb, 0x6c, 0xbc, 0x66, 0x3c, 0x1e, 0xaf, 0x19, 0x5f, 0x8e, 0xd7, 0x8c, - 0xaf, 0xc6, 0x6b, 0xc6, 0xbf, 0xc6, 0x6b, 0xc6, 0xa3, 0x7f, 0xaf, 0x9d, 0xbb, 0x5b, 0x8e, 0x4f, - 0xff, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xd1, 0xc2, 0x4e, 0x6e, 0x3f, 0x25, 0x00, 0x00, + proto.RegisterFile("github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1/generated.proto", fileDescriptor_generated_ec9cfdab9b6e0e15) +} + +var fileDescriptor_generated_ec9cfdab9b6e0e15 = []byte{ + // 2600 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x59, 0xcd, 0x6f, 0x1b, 0xc7, + 0x15, 0xf7, 0xf2, 0x4b, 0xe4, 0x93, 0x6c, 0xc9, 0xe3, 0x18, 0x21, 0x14, 0x44, 0x32, 0x36, 0x68, + 0xe0, 0x16, 0x31, 0x69, 0x5b, 0x4d, 0xe1, 0x16, 0x48, 0x13, 0x51, 0x94, 0x63, 0x59, 0xb2, 0x2c, + 0x0f, 0x63, 0x17, 0x70, 0x03, 0xd4, 0xab, 0xdd, 0x21, 0xb5, 0xd6, 0x72, 0x77, 0x3d, 0x33, 0x54, + 0xcd, 0xa2, 0x68, 0x93, 0x7e, 0x5c, 0x7a, 0x28, 0x72, 0xef, 0xb1, 0xff, 0x40, 0x7b, 0x29, 0x7a, + 0xee, 0xc9, 0x97, 0x02, 0x29, 0x0a, 0x14, 0xe9, 0x45, 0xa8, 0x59, 0xa0, 0x28, 0xfa, 0x27, 0xe4, + 0x54, 0xcc, 0xc7, 0xce, 0x2e, 0x97, 0x12, 0x2c, 0x8b, 0xba, 0xd8, 0xdc, 0xf7, 0xde, 0xfc, 0xde, + 0x9b, 0x37, 0x6f, 0xde, 0xc7, 0x08, 0xee, 0xf4, 0x7c, 0xbe, 0x37, 0xd8, 0x6d, 0xb8, 0x51, 0xbf, + 0xe9, 0xd0, 0x5e, 0x14, 0xd3, 0xe8, 0xa9, 0xfc, 0x71, 0x8d, 0x1c, 0x90, 0x90, 0xb3, 0x66, 0xbc, + 0xdf, 0x6b, 0x3a, 0xb1, 0xcf, 0x9a, 0x8c, 0x84, 0x2c, 0xa2, 0xcd, 0x83, 0x1b, 0x4e, 0x10, 0xef, + 0x39, 0x37, 0x9a, 0x3d, 0x12, 0x12, 0xea, 0x70, 0xe2, 0x35, 0x62, 0x1a, 0xf1, 0x08, 0xdd, 0x4a, + 0x91, 0x1a, 0x09, 0x92, 0xfc, 0xf1, 0x23, 0x85, 0xd4, 0x88, 0xf7, 0x7b, 0x0d, 0x81, 0xd4, 0x50, + 0x48, 0x8d, 0x04, 0x69, 0xf1, 0x5a, 0xc6, 0x86, 0x5e, 0xd4, 0x8b, 0x9a, 0x12, 0x70, 0x77, 0xd0, + 0x95, 0x5f, 0xf2, 0x43, 0xfe, 0x52, 0x8a, 0x16, 0xed, 0xfd, 0x5b, 0xac, 0xe1, 0x47, 0xc2, 0xaa, + 0xa6, 0x1b, 0x51, 0xd2, 0x3c, 0x98, 0x30, 0x66, 0xf1, 0xdb, 0xa9, 0x4c, 0xdf, 0x71, 0xf7, 0xfc, + 0x90, 0xd0, 0x61, 0xba, 0x95, 0x3e, 0xe1, 0xce, 0x51, 0xab, 0x9a, 0xc7, 0xad, 0xa2, 0x83, 0x90, + 0xfb, 0x7d, 0x32, 0xb1, 0xe0, 0x3b, 0xaf, 0x5a, 0xc0, 0xdc, 0x3d, 0xd2, 0x77, 0x26, 0xd6, 0xad, + 0x1c, 0xb7, 0x6e, 0xc0, 0xfd, 0xa0, 0xe9, 0x87, 0x9c, 0x71, 0x9a, 0x5f, 0x64, 0xff, 0xa3, 0x08, + 0x0b, 0xab, 0x94, 0xfb, 0x5d, 0xc7, 0xe5, 0x5b, 0x91, 0xeb, 0x70, 0x3f, 0x0a, 0xd1, 0xa7, 0x50, + 0x60, 0x2b, 0x75, 0xeb, 0x8a, 0x75, 0x75, 0xf6, 0x66, 0xbb, 0x71, 0xda, 0x23, 0x68, 0x74, 0x56, + 0x12, 0xe4, 0x56, 0x65, 0x74, 0xb8, 0x5c, 0xe8, 0xac, 0xe0, 0x02, 0x5b, 0x41, 0x36, 0x54, 0xfc, + 0x30, 0xf0, 0x43, 0x52, 0x2f, 0x5c, 0xb1, 0xae, 0xd6, 0x5a, 0x30, 0x3a, 0x5c, 0xae, 0x6c, 0x48, + 0x0a, 0xd6, 0x1c, 0xe4, 0x41, 0xa9, 0xeb, 0x07, 0xa4, 0x5e, 0x94, 0x36, 0xdc, 0x3e, 0xbd, 0x0d, + 0xb7, 0xfd, 0x80, 0x18, 0x2b, 0xaa, 0xa3, 0xc3, 0xe5, 0x92, 0xa0, 0x60, 0x89, 0x8e, 0x9e, 0x40, + 0x71, 0x40, 0x83, 0x7a, 0x49, 0x2a, 0x59, 0x3f, 0xbd, 0x92, 0x87, 0x78, 0xcb, 0xe8, 0x98, 0x19, + 0x1d, 0x2e, 0x17, 0x1f, 0xe2, 0x2d, 0x2c, 0xa0, 0xd1, 0x73, 0xa8, 0xb9, 0x51, 0xd8, 0xf5, 0x7b, + 0x7d, 0x27, 0xae, 0x97, 0xa5, 0x9e, 0xcd, 0xd3, 0xeb, 0x59, 0x4b, 0xa0, 0x8c, 0xb6, 0xf3, 0xa3, + 0xc3, 0xe5, 0x9a, 0x21, 0xe3, 0x54, 0x99, 0xfd, 0x6b, 0x0b, 0x2e, 0x4e, 0xc8, 0xa3, 0x2b, 0x50, + 0x0a, 0x9d, 0x3e, 0x91, 0x67, 0x5b, 0x6b, 0xcd, 0xbd, 0x38, 0x5c, 0x3e, 0x27, 0x7c, 0xb2, 0xed, + 0xf4, 0x09, 0x96, 0x1c, 0xd4, 0x84, 0x9a, 0xf8, 0x9f, 0xc5, 0x8e, 0x9b, 0x1c, 0xd0, 0x45, 0x2d, + 0x56, 0xdb, 0x4e, 0x18, 0x38, 0x95, 0x41, 0x6f, 0x43, 0x71, 0x9f, 0x0c, 0xe5, 0x49, 0xd5, 0x5a, + 0xb3, 0x5a, 0xb4, 0xb8, 0x49, 0x86, 0x58, 0xd0, 0x6d, 0x06, 0xa5, 0xb6, 0xc3, 0x1d, 0xb4, 0x0f, + 0x33, 0x5d, 0x3f, 0xe0, 0x84, 0xb2, 0xba, 0x75, 0xa5, 0x38, 0x5d, 0x60, 0x09, 0xc0, 0xdb, 0x12, + 0xac, 0x35, 0x3b, 0x3a, 0x5c, 0x9e, 0x51, 0xbf, 0x19, 0x4e, 0x34, 0xd8, 0x9f, 0x5b, 0x00, 0xa9, + 0x90, 0xd8, 0x75, 0xec, 0xf0, 0xbd, 0xfc, 0xae, 0x77, 0x1c, 0xbe, 0x87, 0x25, 0x07, 0xbd, 0x07, + 0x25, 0x3e, 0x8c, 0x93, 0x0d, 0xd7, 0x13, 0x89, 0x4f, 0x86, 0x31, 0xf9, 0xfa, 0x70, 0xb9, 0x7a, + 0xb7, 0x73, 0x7f, 0x5b, 0xfc, 0xc6, 0x52, 0x0a, 0xbd, 0x03, 0xe5, 0x03, 0x27, 0x18, 0x10, 0xbd, + 0xe9, 0xf3, 0x5a, 0xbc, 0xfc, 0x48, 0x10, 0xb1, 0xe2, 0xd9, 0xbf, 0xb3, 0xa0, 0xbc, 0x2e, 0x36, + 0x82, 0x9e, 0xc1, 0x8c, 0x1b, 0x85, 0x9c, 0x3c, 0xe7, 0xfa, 0x4e, 0x4d, 0x11, 0xcf, 0x12, 0x71, + 0x4d, 0xa1, 0xb5, 0xe6, 0xb5, 0xe2, 0x19, 0x4d, 0xc0, 0x89, 0x1e, 0xb4, 0x0c, 0x25, 0xcf, 0xe1, + 0x8e, 0xdc, 0xcf, 0x9c, 0x72, 0xd2, 0x8e, 0x33, 0x0c, 0x22, 0xc7, 0xc3, 0x92, 0x61, 0xff, 0xa1, + 0x02, 0x73, 0x59, 0x2c, 0x71, 0xee, 0x52, 0xb7, 0xd8, 0xa6, 0x76, 0x94, 0x39, 0xf7, 0xf5, 0x84, + 0x81, 0x53, 0x19, 0xd4, 0x86, 0x05, 0xf3, 0xf1, 0x88, 0x50, 0xe6, 0x47, 0x61, 0xce, 0x7d, 0x0b, + 0xeb, 0x39, 0x3e, 0x9e, 0x58, 0x81, 0xee, 0x02, 0x72, 0x83, 0x68, 0xe0, 0x49, 0x51, 0x96, 0xe0, + 0x28, 0xbf, 0x2e, 0x6a, 0x1c, 0xb4, 0x36, 0x21, 0x81, 0x8f, 0x58, 0x85, 0x1c, 0xa8, 0xb0, 0x68, + 0x40, 0x5d, 0xa2, 0x6f, 0xf4, 0x07, 0xd3, 0xdc, 0xe8, 0x0d, 0x95, 0x97, 0x3a, 0x12, 0x10, 0x6b, + 0x60, 0xf4, 0x4d, 0x98, 0x91, 0x4b, 0x37, 0xda, 0xf2, 0x36, 0xd7, 0xd2, 0x23, 0x58, 0x57, 0x64, + 0x9c, 0xf0, 0xd1, 0x93, 0xc4, 0xa1, 0x7e, 0x9f, 0xd4, 0x2b, 0xd2, 0xa0, 0x66, 0x43, 0xa5, 0xe8, + 0x46, 0x36, 0x45, 0xa7, 0x46, 0x88, 0x0a, 0xd2, 0x38, 0xb8, 0xd1, 0xb8, 0xe7, 0xbb, 0x34, 0x12, + 0xcb, 0xf2, 0x27, 0xe0, 0xf7, 0xcd, 0x09, 0xf8, 0x7d, 0x82, 0x9e, 0x42, 0x4d, 0x95, 0x82, 0x87, + 0x78, 0xab, 0x3e, 0x73, 0x16, 0x5b, 0x96, 0xe9, 0xa4, 0x93, 0x60, 0xe2, 0x14, 0x1e, 0xbd, 0x0f, + 0xb3, 0x32, 0xb6, 0x74, 0x80, 0x54, 0xe5, 0xe6, 0x2f, 0x69, 0xf3, 0x66, 0xd7, 0x52, 0x16, 0xce, + 0xca, 0xa1, 0xdf, 0x58, 0x00, 0xe4, 0x39, 0x27, 0xa1, 0x38, 0x20, 0x56, 0xaf, 0xc9, 0x9b, 0xff, + 0xe8, 0x6c, 0xc2, 0xbf, 0xb1, 0x6e, 0x80, 0xd7, 0x43, 0x4e, 0x87, 0x2d, 0xa4, 0xcd, 0x81, 0x94, + 0x81, 0x33, 0xda, 0x17, 0x3f, 0x80, 0xf9, 0xdc, 0x12, 0xb4, 0xa0, 0x92, 0x97, 0x8c, 0x77, 0x99, + 0xaf, 0xd0, 0x1b, 0xc9, 0xdd, 0x96, 0xb1, 0xac, 0x2f, 0xf3, 0xf7, 0x0a, 0xb7, 0x2c, 0xfb, 0xb7, + 0x05, 0x98, 0x97, 0xfa, 0xdb, 0x24, 0x26, 0xa1, 0x47, 0x42, 0x77, 0x78, 0x82, 0x7c, 0xfa, 0x1e, + 0x54, 0x3d, 0xe2, 0x78, 0xa6, 0xde, 0x15, 0x5b, 0x0b, 0x5a, 0xaa, 0xda, 0xd6, 0x74, 0x6c, 0x24, + 0xd0, 0x4f, 0xd2, 0x2c, 0xa9, 0x4a, 0xdf, 0xfd, 0x29, 0x7d, 0x95, 0xda, 0xaa, 0x13, 0xa6, 0x09, + 0xd8, 0x7c, 0xd2, 0x14, 0x19, 0xc0, 0x8d, 0xc2, 0x90, 0xb8, 0x9c, 0x78, 0xf2, 0x06, 0x55, 0xd3, + 0xf8, 0x5b, 0x4b, 0x18, 0x38, 0x95, 0xb1, 0xff, 0x57, 0x80, 0xcb, 0x47, 0x2a, 0x39, 0x81, 0x5b, + 0x76, 0xa1, 0x24, 0x7a, 0x19, 0xe9, 0x92, 0xa9, 0x6a, 0x81, 0xb8, 0x09, 0x7a, 0x6b, 0xb2, 0xbc, + 0xcb, 0x4b, 0x22, 0xb1, 0x51, 0x3f, 0xcd, 0xbb, 0xc5, 0x33, 0xcd, 0xbb, 0xb3, 0x47, 0xe6, 0xdc, + 0x4f, 0x75, 0xce, 0x55, 0xc9, 0xe7, 0xfb, 0xd3, 0x95, 0x37, 0xb5, 0x19, 0xf1, 0x4b, 0x27, 0xec, + 0x3f, 0x16, 0xe0, 0xbc, 0x34, 0x62, 0x47, 0xf4, 0x6d, 0x6e, 0x14, 0x08, 0x7d, 0x3c, 0x4d, 0xd6, + 0x77, 0x72, 0x35, 0xeb, 0xd6, 0xab, 0x7a, 0x70, 0x37, 0xea, 0xf7, 0xa3, 0xb0, 0x31, 0x86, 0x99, + 0xa9, 0x71, 0x4f, 0xa0, 0xb4, 0xc7, 0x79, 0xac, 0x0f, 0x68, 0x8a, 0xdd, 0xdc, 0xe1, 0x3c, 0x4e, + 0x43, 0x40, 0x7c, 0x61, 0x89, 0x2c, 0x34, 0x84, 0x0e, 0x4f, 0x02, 0x7d, 0x0a, 0x0d, 0xdb, 0x0e, + 0x67, 0xd9, 0x20, 0xe3, 0x0c, 0x4b, 0x64, 0xfb, 0x3a, 0xcc, 0x65, 0xfb, 0xbf, 0x57, 0xf7, 0x01, + 0xf6, 0xaf, 0x2c, 0x58, 0xf8, 0x98, 0x46, 0x83, 0x58, 0xd7, 0x94, 0x4d, 0x3f, 0xf4, 0x44, 0xb9, + 0xef, 0x09, 0x9a, 0x5e, 0x67, 0xca, 0xbd, 0x14, 0xc4, 0x8a, 0x27, 0x2a, 0xc3, 0xc1, 0x58, 0x15, + 0x34, 0x17, 0x2d, 0x29, 0x59, 0x09, 0x5f, 0x98, 0xb1, 0xef, 0x87, 0x9e, 0xae, 0x72, 0xc6, 0x0c, + 0xa1, 0x0b, 0x4b, 0x8e, 0x7d, 0x15, 0xa4, 0xa3, 0xa4, 0xc1, 0x11, 0xe5, 0x13, 0x06, 0x47, 0x94, + 0x63, 0xc9, 0xb1, 0xff, 0x5b, 0x02, 0xb9, 0x63, 0xd1, 0x86, 0x89, 0x5e, 0xd6, 0x1a, 0x6f, 0xc3, + 0x4c, 0x23, 0xda, 0x81, 0xcb, 0x8c, 0x3b, 0x94, 0xff, 0xc0, 0xe7, 0x7b, 0x5b, 0x0e, 0xe3, 0x98, + 0xb8, 0xc4, 0x3f, 0x20, 0x9e, 0x34, 0xb6, 0xda, 0x7a, 0x5b, 0x2f, 0xb8, 0xdc, 0x39, 0x4a, 0x08, + 0x1f, 0xbd, 0x16, 0xdd, 0x83, 0x4b, 0x1e, 0x09, 0xfc, 0x03, 0x42, 0x57, 0x83, 0x60, 0xf5, 0xc0, + 0xf1, 0x03, 0x67, 0x57, 0x37, 0xed, 0xd5, 0xd6, 0x5b, 0x1a, 0xf2, 0x52, 0x7b, 0x52, 0x04, 0x1f, + 0xb5, 0x0e, 0xad, 0xc2, 0xbc, 0xd4, 0xb3, 0xca, 0x3b, 0xe4, 0xd9, 0x80, 0x84, 0xba, 0x90, 0xd7, + 0x5a, 0x6f, 0x6a, 0xa8, 0xf9, 0xce, 0x38, 0x1b, 0xe7, 0xe5, 0x45, 0x99, 0xd2, 0x24, 0x59, 0x76, + 0xcb, 0xe3, 0x65, 0xaa, 0x93, 0xb2, 0x70, 0x56, 0x4e, 0xf4, 0x32, 0x99, 0xcf, 0x36, 0x09, 0xb8, + 0x23, 0x4b, 0x76, 0xa6, 0x97, 0xe9, 0xe4, 0xf8, 0x78, 0x62, 0x85, 0x08, 0x01, 0x6f, 0x40, 0xa5, + 0x0b, 0x66, 0xa4, 0x0b, 0x4c, 0x08, 0xb4, 0x15, 0x19, 0x27, 0x7c, 0x99, 0x6b, 0x83, 0x01, 0xe3, + 0x84, 0x6e, 0x78, 0xba, 0x98, 0xa6, 0xb9, 0x36, 0x61, 0xe0, 0x54, 0x46, 0x94, 0x11, 0x37, 0xf0, + 0x45, 0x67, 0xe1, 0xd5, 0x6b, 0x52, 0xde, 0x94, 0x91, 0x35, 0x4d, 0xc7, 0x46, 0x02, 0x75, 0x74, + 0x6a, 0x00, 0x29, 0xf9, 0x61, 0x2e, 0x35, 0x34, 0x4f, 0x98, 0x1a, 0x44, 0x5c, 0xa5, 0x19, 0xc1, + 0xfe, 0x73, 0x09, 0x60, 0x3b, 0xf2, 0x48, 0x87, 0x3b, 0x7c, 0xc0, 0xd0, 0x22, 0x14, 0x7c, 0x4f, + 0xc7, 0x1b, 0x68, 0x0d, 0x85, 0x8d, 0x36, 0x2e, 0xf8, 0x9e, 0xc9, 0xff, 0x85, 0x63, 0xf3, 0xff, + 0xfb, 0x30, 0xeb, 0xf9, 0x2c, 0x0e, 0x9c, 0xa1, 0x20, 0xea, 0xab, 0x60, 0x0e, 0xaa, 0x9d, 0xb2, + 0x70, 0x56, 0xce, 0xf4, 0xe9, 0xa5, 0xa3, 0xfb, 0x74, 0x61, 0x5e, 0x26, 0x87, 0x5d, 0x87, 0x72, + 0xbc, 0xe7, 0xb0, 0x24, 0x0e, 0x92, 0x7e, 0xb2, 0xbc, 0x23, 0x88, 0x5f, 0x8b, 0x81, 0x26, 0xf2, + 0x88, 0xfc, 0xc0, 0x4a, 0x50, 0x34, 0x6d, 0xf2, 0x58, 0x89, 0xb7, 0xca, 0xa7, 0x6e, 0xda, 0x3a, + 0x09, 0x12, 0x4e, 0x41, 0x51, 0x57, 0x34, 0x52, 0xfd, 0x38, 0x20, 0x4a, 0xc7, 0xcc, 0xe9, 0x74, + 0x64, 0x3a, 0x2f, 0x83, 0x85, 0xb3, 0xc0, 0x22, 0x18, 0xfb, 0x84, 0x31, 0xa7, 0x97, 0x34, 0x6b, + 0x26, 0x18, 0xef, 0x29, 0x32, 0x4e, 0xf8, 0xe8, 0x09, 0x94, 0xe5, 0xc1, 0xcb, 0xc0, 0x9a, 0xbd, + 0xf9, 0xe1, 0x94, 0x55, 0xb2, 0x55, 0x13, 0x3e, 0x96, 0x3f, 0xb1, 0x02, 0xb6, 0x7f, 0x51, 0x86, + 0x0b, 0x98, 0xa8, 0x1e, 0xfa, 0xfe, 0xee, 0x53, 0xe2, 0xf2, 0xf1, 0x39, 0xd3, 0x3a, 0xc1, 0x9c, + 0xf9, 0x53, 0xa8, 0x04, 0xce, 0x2e, 0x09, 0x44, 0xc1, 0x10, 0x5d, 0xe4, 0x27, 0xa7, 0x37, 0x73, + 0xdc, 0x94, 0xc6, 0x96, 0x84, 0x55, 0x3d, 0xe4, 0x05, 0x6d, 0x43, 0x45, 0x11, 0xb1, 0xd6, 0x89, + 0x7e, 0x0e, 0x10, 0x3b, 0xd4, 0xe9, 0x13, 0xd9, 0x9b, 0x95, 0xa4, 0x05, 0x9b, 0xd3, 0x5b, 0xb0, + 0x93, 0x60, 0xa6, 0xcd, 0xab, 0x21, 0x31, 0x9c, 0x51, 0x89, 0xbe, 0xb0, 0x60, 0xa1, 0x97, 0xab, + 0x4c, 0xfa, 0x45, 0xe1, 0xee, 0xe9, 0xed, 0xc8, 0xd7, 0xba, 0x34, 0xdf, 0xe5, 0x39, 0x78, 0x42, + 0x3b, 0xa2, 0x66, 0xde, 0xaa, 0x4c, 0x6b, 0x47, 0xfe, 0x09, 0x2a, 0x3d, 0x87, 0xf1, 0x01, 0x6c, + 0xf1, 0xbb, 0x30, 0x9b, 0x39, 0xae, 0xd7, 0xea, 0xdf, 0x7f, 0x6f, 0xc1, 0xc5, 0x09, 0xbf, 0xa3, + 0x00, 0x8a, 0x8c, 0xba, 0x7a, 0x30, 0x7f, 0x70, 0x86, 0x27, 0xaa, 0x0c, 0x57, 0xef, 0x41, 0x1d, + 0xea, 0x62, 0xa1, 0x46, 0x24, 0x46, 0x8f, 0x30, 0x9e, 0x4f, 0x8c, 0x6d, 0xc2, 0x38, 0x96, 0x1c, + 0xfb, 0x73, 0x0b, 0xde, 0x3c, 0x06, 0x4b, 0x34, 0x22, 0xea, 0xa2, 0xe6, 0x1a, 0x91, 0xec, 0x5d, + 0x33, 0x4d, 0x4e, 0xe1, 0xd8, 0xc7, 0x8e, 0xe5, 0xf1, 0xe7, 0x8b, 0xda, 0xc4, 0xd3, 0xc5, 0x3c, + 0x9c, 0xc7, 0x84, 0xd3, 0x61, 0x87, 0x53, 0x87, 0x93, 0xde, 0xd0, 0xfe, 0x67, 0x01, 0x20, 0x7d, + 0xcd, 0x4b, 0x9e, 0x7c, 0xac, 0xa3, 0x9f, 0x7c, 0xd0, 0xa3, 0xc4, 0x4c, 0x65, 0xc2, 0x47, 0x63, + 0x66, 0xe6, 0xea, 0x4f, 0xdf, 0x0f, 0xfd, 0x48, 0xfd, 0x7b, 0xad, 0x17, 0x35, 0xb6, 0x23, 0xee, + 0x77, 0x7d, 0x15, 0x03, 0xe9, 0xab, 0x83, 0xde, 0x59, 0x17, 0x2a, 0x6a, 0x56, 0xd1, 0x2d, 0x63, + 0x6b, 0x9a, 0xa7, 0x49, 0x3d, 0x33, 0xc8, 0x21, 0x5f, 0xfd, 0xc6, 0x1a, 0x1d, 0x05, 0x50, 0x65, + 0x2b, 0xad, 0x81, 0xbb, 0x4f, 0xb8, 0x6e, 0xe6, 0xa7, 0xd2, 0xa4, 0x90, 0x5a, 0x73, 0xa2, 0x56, + 0x27, 0x5f, 0xd8, 0x68, 0xb0, 0x0f, 0x0b, 0x60, 0xc8, 0xa2, 0xcc, 0x93, 0xd0, 0x8b, 0x23, 0xdf, + 0x1c, 0xb2, 0x29, 0xf3, 0xeb, 0x9a, 0x8e, 0x8d, 0x04, 0x7a, 0x17, 0x2a, 0xbb, 0xca, 0x4c, 0xe5, + 0x69, 0x73, 0x69, 0xb4, 0x12, 0xcd, 0x15, 0x72, 0x94, 0xf4, 0xd2, 0x87, 0x15, 0x23, 0x87, 0x25, + 0x15, 0x6b, 0xae, 0xd0, 0xee, 0x87, 0x8c, 0xb8, 0x03, 0x4a, 0xf4, 0x00, 0x68, 0xb4, 0x6f, 0x68, + 0x3a, 0x36, 0x12, 0x08, 0x43, 0xcd, 0x71, 0x5d, 0xc2, 0xd8, 0x26, 0x19, 0xea, 0x4c, 0xf4, 0x8d, + 0x4c, 0x1d, 0x6b, 0xb8, 0x11, 0x25, 0xa2, 0x6a, 0x75, 0x88, 0x4b, 0x09, 0xdf, 0x24, 0xc3, 0x0e, + 0x09, 0x88, 0xcb, 0x23, 0xaa, 0x9e, 0x19, 0x56, 0x93, 0xb5, 0x38, 0x85, 0x11, 0x98, 0x2c, 0x11, + 0xd7, 0x59, 0xe5, 0x75, 0x30, 0x0d, 0x19, 0xa7, 0x30, 0xf6, 0x63, 0xe1, 0x5f, 0x3d, 0x98, 0xbe, + 0x0b, 0x95, 0x98, 0x92, 0xae, 0xff, 0x5c, 0x7b, 0xd7, 0x78, 0x62, 0x47, 0x52, 0xb1, 0xe6, 0x0a, + 0x39, 0x36, 0xe8, 0x0a, 0xb9, 0x9c, 0x67, 0x3b, 0x92, 0x8a, 0x35, 0xd7, 0xfe, 0x4b, 0x01, 0x2a, + 0x1d, 0x79, 0xe2, 0xe8, 0x09, 0x54, 0x45, 0x9d, 0x96, 0x23, 0xa0, 0xca, 0x26, 0xd7, 0x4f, 0x56, + 0xd5, 0x55, 0x15, 0xba, 0x47, 0xb8, 0x93, 0x16, 0x81, 0x94, 0x86, 0x0d, 0x2a, 0xea, 0x42, 0x89, + 0xc5, 0xc4, 0x9d, 0x7e, 0x66, 0x56, 0x16, 0x77, 0x62, 0xe2, 0xa6, 0xf9, 0x41, 0x7c, 0x61, 0x89, + 0x8f, 0x42, 0xa8, 0x30, 0xd9, 0xe3, 0x4d, 0x3f, 0x36, 0x6b, 0x4d, 0x12, 0x2d, 0xe3, 0x44, 0xf9, + 0x8d, 0xb5, 0x16, 0xfb, 0x6f, 0x16, 0x80, 0x12, 0xdc, 0xf2, 0x99, 0x98, 0xa3, 0xf3, 0x8e, 0x6c, + 0x9c, 0xcc, 0x91, 0x62, 0xb5, 0x74, 0xa3, 0x89, 0xda, 0x84, 0x92, 0x71, 0x22, 0x81, 0xb2, 0xcf, + 0x49, 0x9f, 0xd5, 0x0b, 0xb2, 0x86, 0x7f, 0x34, 0xed, 0xde, 0xd2, 0x2c, 0xbc, 0x21, 0x60, 0xb1, + 0x42, 0xb7, 0xff, 0x5e, 0x4c, 0xf6, 0x24, 0x1c, 0x8b, 0x7e, 0x69, 0xc1, 0x9c, 0x97, 0xbc, 0x92, + 0xf8, 0x24, 0x79, 0x03, 0xdf, 0x38, 0xb3, 0xd7, 0x9d, 0xd6, 0x1b, 0xda, 0x8c, 0xb9, 0x76, 0x46, + 0x0d, 0x1e, 0x53, 0x8a, 0x22, 0xa8, 0x72, 0xea, 0xf7, 0x7a, 0xa2, 0x85, 0x51, 0xdb, 0x5f, 0x9d, + 0xe2, 0xe1, 0x45, 0x21, 0xa5, 0xce, 0xd6, 0x04, 0x86, 0x8d, 0x12, 0xb4, 0x09, 0xe0, 0x91, 0x38, + 0x88, 0x86, 0xc2, 0x09, 0x3a, 0x9a, 0xde, 0x3a, 0xea, 0x3e, 0xef, 0x44, 0x9e, 0x0c, 0xc7, 0x0b, + 0x22, 0xf8, 0xdb, 0x66, 0x09, 0xce, 0x2c, 0x47, 0x9f, 0x59, 0x70, 0x9e, 0x64, 0x5f, 0x2b, 0x74, + 0x72, 0xfe, 0x78, 0x4a, 0x27, 0x26, 0x70, 0xad, 0x8b, 0xa3, 0xc3, 0xe5, 0xf1, 0x37, 0x16, 0x3c, + 0xae, 0xd0, 0xfe, 0x4f, 0x09, 0xe6, 0xb2, 0x21, 0x9d, 0x4e, 0x18, 0xd6, 0x49, 0x27, 0x8c, 0x1f, + 0x66, 0x27, 0x0c, 0x75, 0x93, 0xbf, 0x75, 0xb2, 0xf0, 0x3e, 0xc1, 0x70, 0xe1, 0x8c, 0x0f, 0x17, + 0xc5, 0xd7, 0x86, 0x7f, 0xad, 0xb9, 0xa2, 0xf4, 0x8a, 0xb9, 0xe2, 0x00, 0xca, 0x61, 0xe4, 0x11, + 0x56, 0x2f, 0xcb, 0x58, 0x7b, 0x70, 0x36, 0x69, 0xa4, 0x21, 0x5c, 0xaa, 0xbb, 0x75, 0x73, 0xf7, + 0x24, 0x0d, 0x2b, 0x75, 0x68, 0x15, 0xe6, 0xb5, 0xc5, 0x7e, 0x14, 0xae, 0x45, 0x83, 0x50, 0x8d, + 0x72, 0xe5, 0xf4, 0x1d, 0x61, 0x6d, 0x9c, 0x8d, 0xf3, 0xf2, 0x8b, 0x3f, 0x53, 0xa3, 0xee, 0xb1, + 0x5d, 0xe6, 0xe3, 0x6c, 0x97, 0x39, 0x55, 0x2e, 0x4e, 0x27, 0xea, 0x6c, 0xaf, 0xda, 0x01, 0x48, + 0x1f, 0x36, 0x45, 0xdf, 0x27, 0xcf, 0x38, 0xdf, 0xf7, 0xc9, 0x18, 0xc0, 0x8a, 0x27, 0xfa, 0x3e, + 0xc6, 0xa3, 0x38, 0xdf, 0xf7, 0x75, 0x78, 0x14, 0x63, 0xc9, 0xb1, 0xff, 0x5a, 0x80, 0x19, 0x7d, + 0x49, 0x4f, 0xf0, 0x42, 0x4b, 0xa1, 0x4a, 0x75, 0x1f, 0xaa, 0x77, 0x79, 0xe7, 0xac, 0x26, 0x2e, + 0xd5, 0x0b, 0x25, 0x34, 0x6c, 0xf4, 0x64, 0x83, 0xab, 0xf8, 0x8a, 0xe0, 0x12, 0xd9, 0x80, 0x92, + 0x38, 0x30, 0x4d, 0xea, 0xf4, 0xd9, 0x60, 0xac, 0xe7, 0x55, 0xd9, 0x60, 0x8c, 0x84, 0xc7, 0x15, + 0xda, 0x7f, 0x2a, 0x40, 0xf1, 0x21, 0xde, 0x90, 0xcd, 0x82, 0xbb, 0x47, 0x8c, 0x37, 0xd3, 0x3a, + 0x27, 0xa9, 0x58, 0x73, 0x85, 0xcf, 0x07, 0x8c, 0xd0, 0xfc, 0x09, 0x3d, 0x64, 0x84, 0x62, 0xc9, + 0x11, 0x0d, 0x58, 0xec, 0x30, 0xf6, 0xe3, 0x88, 0x26, 0xaf, 0x83, 0x26, 0xbb, 0xee, 0x68, 0x3a, + 0x36, 0x12, 0x02, 0x6f, 0x2f, 0x62, 0x5c, 0xdf, 0xc3, 0xf4, 0x89, 0x35, 0x12, 0xc3, 0x84, 0xe0, + 0x98, 0xf7, 0xc3, 0xb2, 0x0c, 0xff, 0x23, 0xde, 0x0f, 0xcd, 0xb4, 0x50, 0x39, 0x76, 0x5a, 0x78, + 0x07, 0xca, 0xcf, 0x06, 0x84, 0x0e, 0xe5, 0x53, 0x45, 0x26, 0xf8, 0x1e, 0x08, 0x22, 0x56, 0x3c, + 0x61, 0x78, 0x97, 0x3a, 0xbd, 0xbe, 0xe8, 0xfa, 0xab, 0xe3, 0x86, 0xdf, 0xd6, 0x74, 0x6c, 0x24, + 0x6c, 0x17, 0x66, 0x33, 0x7f, 0x32, 0x3f, 0xc1, 0x9f, 0x67, 0x6f, 0x02, 0x1c, 0x10, 0xea, 0x77, + 0x87, 0x6b, 0x84, 0x72, 0xfd, 0x64, 0x69, 0x7a, 0xa5, 0x47, 0x86, 0x83, 0x33, 0x52, 0xad, 0xc6, + 0x8b, 0x97, 0x4b, 0xe7, 0xbe, 0x7c, 0xb9, 0x74, 0xee, 0xab, 0x97, 0x4b, 0xe7, 0x3e, 0x1b, 0x2d, + 0x59, 0x2f, 0x46, 0x4b, 0xd6, 0x97, 0xa3, 0x25, 0xeb, 0xab, 0xd1, 0x92, 0xf5, 0xaf, 0xd1, 0x92, + 0xf5, 0xc5, 0xbf, 0x97, 0xce, 0x3d, 0xae, 0x26, 0xa7, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xbe, 0x5c, 0xc6, 0xc6, 0xb5, 0x22, 0x00, 0x00, } diff --git a/pkg/apis/sensor/v1alpha1/generated.proto b/pkg/apis/sensor/v1alpha1/generated.proto index a0fc576083..80fd25c6a5 100644 --- a/pkg/apis/sensor/v1alpha1/generated.proto +++ b/pkg/apis/sensor/v1alpha1/generated.proto @@ -56,9 +56,6 @@ message ConfigmapArtifact { message Data { // filter constraints repeated DataFilter filters = 1; - - // EscalationPolicy is the escalation to trigger in case the event filter fails - optional EscalationPolicy escalationPolicy = 2; } // DataFilter describes constraints and filters for event data @@ -80,24 +77,6 @@ message DataFilter { // Strings are taken as is // Nils this value is ignored optional string value = 3; - - // EscalationPolicy is the escalation to trigger in case the event filter fails - optional EscalationPolicy escalationPolicy = 4; -} - -// EscalationPolicy describes the policy for escalating sensors in an Error state. -// An escalation policy is associated with event filter. Whenever a event filter fails -// escalation will be triggered -message EscalationPolicy { - // Name is name of the escalation policy - // This is referred by event filter/s - optional string name = 1; - - // Level is the degree of importance - optional string level = 2; - - // need someway to progressively get more serious notifications - optional string message = 3; } // Event is a data record expressing an occurrence and its context. @@ -147,9 +126,6 @@ message EventContext { // Enables a place for custom fields a producer or middleware might want to include and provides a place // to test metadata before adding them to the CloudEvents specification. map extensions = 9; - - // EscalationPolicy is the name of escalation policy to trigger in case the event filter fails - optional EscalationPolicy escalationPolicy = 10; } // EventDependency describes a dependency @@ -443,9 +419,6 @@ message TimeFilter { // After this time, events for this event are ignored and // format is hh:mm:ss optional string stop = 2; - - // EscalationPolicy is the escalation to trigger in case the event filter fails - optional EscalationPolicy escalationPolicy = 3; } // Trigger is an action taken, output produced, an event created, a message sent diff --git a/pkg/apis/sensor/v1alpha1/openapi_generated.go b/pkg/apis/sensor/v1alpha1/openapi_generated.go index edafd08a99..b3a205e29a 100644 --- a/pkg/apis/sensor/v1alpha1/openapi_generated.go +++ b/pkg/apis/sensor/v1alpha1/openapi_generated.go @@ -32,7 +32,6 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.ConfigmapArtifact": schema_pkg_apis_sensor_v1alpha1_ConfigmapArtifact(ref), "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.Data": schema_pkg_apis_sensor_v1alpha1_Data(ref), "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.DataFilter": schema_pkg_apis_sensor_v1alpha1_DataFilter(ref), - "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EscalationPolicy": schema_pkg_apis_sensor_v1alpha1_EscalationPolicy(ref), "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.Event": schema_pkg_apis_sensor_v1alpha1_Event(ref), "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EventContext": schema_pkg_apis_sensor_v1alpha1_EventContext(ref), "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EventDependency": schema_pkg_apis_sensor_v1alpha1_EventDependency(ref), @@ -157,18 +156,12 @@ func schema_pkg_apis_sensor_v1alpha1_Data(ref common.ReferenceCallback) common.O }, }, }, - "escalationPolicy": { - SchemaProps: spec.SchemaProps{ - Description: "EscalationPolicy is the escalation to trigger in case the event filter fails", - Ref: ref("github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EscalationPolicy"), - }, - }, }, Required: []string{"filters"}, }, }, Dependencies: []string{ - "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.DataFilter", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EscalationPolicy"}, + "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.DataFilter"}, } } @@ -200,53 +193,10 @@ func schema_pkg_apis_sensor_v1alpha1_DataFilter(ref common.ReferenceCallback) co Format: "", }, }, - "escalationPolicy": { - SchemaProps: spec.SchemaProps{ - Description: "EscalationPolicy is the escalation to trigger in case the event filter fails", - Ref: ref("github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EscalationPolicy"), - }, - }, }, Required: []string{"path", "type", "value"}, }, }, - Dependencies: []string{ - "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EscalationPolicy"}, - } -} - -func schema_pkg_apis_sensor_v1alpha1_EscalationPolicy(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "EscalationPolicy describes the policy for escalating sensors in an Error state. An escalation policy is associated with event filter. Whenever a event filter fails escalation will be triggered", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "name": { - SchemaProps: spec.SchemaProps{ - Description: "Name is name of the escalation policy This is referred by event filter/s", - Type: []string{"string"}, - Format: "", - }, - }, - "level": { - SchemaProps: spec.SchemaProps{ - Description: "Level is the degree of importance", - Type: []string{"string"}, - Format: "", - }, - }, - "message": { - SchemaProps: spec.SchemaProps{ - Description: "need someway to progressively get more serious notifications", - Type: []string{"string"}, - Format: "", - }, - }, - }, - Required: []string{"name", "level", "message"}, - }, - }, Dependencies: []string{}, } } @@ -351,18 +301,12 @@ func schema_pkg_apis_sensor_v1alpha1_EventContext(ref common.ReferenceCallback) }, }, }, - "escalationPolicy": { - SchemaProps: spec.SchemaProps{ - Description: "EscalationPolicy is the name of escalation policy to trigger in case the event filter fails", - Ref: ref("github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EscalationPolicy"), - }, - }, }, Required: []string{"eventType", "eventTypeVersion", "cloudEventsVersion", "source", "eventID", "eventTime", "schemaURL", "contentType"}, }, }, Dependencies: []string{ - "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EscalationPolicy", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.URI", "k8s.io/apimachinery/pkg/apis/meta/v1.MicroTime"}, + "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.URI", "k8s.io/apimachinery/pkg/apis/meta/v1.MicroTime"}, } } @@ -1210,17 +1154,10 @@ func schema_pkg_apis_sensor_v1alpha1_TimeFilter(ref common.ReferenceCallback) co Format: "", }, }, - "escalationPolicy": { - SchemaProps: spec.SchemaProps{ - Description: "EscalationPolicy is the escalation to trigger in case the event filter fails", - Ref: ref("github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EscalationPolicy"), - }, - }, }, }, }, - Dependencies: []string{ - "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EscalationPolicy"}, + Dependencies: []string{}, } } diff --git a/pkg/apis/sensor/v1alpha1/types.go b/pkg/apis/sensor/v1alpha1/types.go index 5b237fd891..22a6f0cdf5 100644 --- a/pkg/apis/sensor/v1alpha1/types.go +++ b/pkg/apis/sensor/v1alpha1/types.go @@ -18,6 +18,7 @@ package v1alpha1 import ( "fmt" + "github.com/argoproj/argo-events/common" "hash/fnv" "github.com/minio/minio-go" @@ -25,15 +26,6 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1" ) -// EventProtocolType is type of the event dispatch protocol. Used for dispatching events -type EventProtocolType string - -// possible types of event dispatch protocol -const ( - HTTP EventProtocolType = "HTTP" - NATS EventProtocolType = "NATS" -) - type NotificationType string const ( @@ -61,15 +53,6 @@ const ( NodePhaseNew NodePhase = "" // the node is new ) -// Type of nats connection. -type NatsType string - -// possible values of nats connection type -const ( - Standard NatsType = "Standard" - Streaming NatsType = "Streaming" -) - // Sensor is the definition of a sensor resource // +genclient // +genclient:noStatus @@ -109,7 +92,7 @@ type SensorSpec struct { // EventProtocol contains configuration necessary to receieve an event from gateway over different communication protocols type EventProtocol struct { // Type defines the type of protocol over which events will be receieved - Type EventProtocolType `json:"type" protobuf:"bytes,1,opt,name=type"` + Type common.EventProtocolType `json:"type" protobuf:"bytes,1,opt,name=type"` // Http contains the information required to setup a http server and listen to incoming events Http Http `json:"http" protobuf:"bytes,2,opt,name=http"` @@ -154,7 +137,7 @@ type Nats struct { ClientId string `json:"clientId,omitempty" protobuf:"bytes,9,opt,name=clientId"` // Type of the connection. either standard or streaming - Type NatsType `json:"type" protobuf:"bytes,10,opt,name=type"` + Type common.NatsType `json:"type" protobuf:"bytes,10,opt,name=type"` } // EventDependency describes a dependency @@ -213,9 +196,6 @@ type TimeFilter struct { // After this time, events for this event are ignored and // format is hh:mm:ss Stop string `json:"stop,omitempty" protobuf:"bytes,2,opt,name=stop"` - - // EscalationPolicy is the escalation to trigger in case the event filter fails - EscalationPolicy *EscalationPolicy `json:"escalationPolicy,omitempty" protobuf:"bytes,3,opt,name=escalationPolicy"` } // JSONType contains the supported JSON types for data filtering @@ -231,9 +211,6 @@ const ( type Data struct { // filter constraints Filters []*DataFilter `json:"filters" protobuf:"bytes,1,rep,name=filters"` - - // EscalationPolicy is the escalation to trigger in case the event filter fails - EscalationPolicy *EscalationPolicy `json:"escalationPolicy,omitempty" protobuf:"bytes,2,opt,name=escalationPolicy"` } // DataFilter describes constraints and filters for event data @@ -255,9 +232,6 @@ type DataFilter struct { // Strings are taken as is // Nils this value is ignored Value string `json:"value" protobuf:"bytes,3,opt,name=value"` - - // EscalationPolicy is the escalation to trigger in case the event filter fails - EscalationPolicy *EscalationPolicy `json:"escalationPolicy,omitempty" protobuf:"bytes,4,opt,name=escalationPolicy"` } // Trigger is an action taken, output produced, an event created, a message sent @@ -329,34 +303,6 @@ type ResourceObject struct { type RetryStrategy struct { } -// EscalationLevel is the degree of importance -type EscalationLevel string - -// possible values for EscalationLevel -const ( - // level 0 of escalation - Alert EscalationLevel = "Alert" - // level 1 of escalation - Warning EscalationLevel = "Warning" - // level 2 of escalation - Critical EscalationLevel = "Critical" -) - -// EscalationPolicy describes the policy for escalating sensors in an Error state. -// An escalation policy is associated with event filter. Whenever a event filter fails -// escalation will be triggered -type EscalationPolicy struct { - // Name is name of the escalation policy - // This is referred by event filter/s - Name string `json:"name" protobuf:"bytes,1,opt,name=name"` - - // Level is the degree of importance - Level EscalationLevel `json:"level" protobuf:"bytes,2,opt,name=level"` - - // need someway to progressively get more serious notifications - Message string `json:"message" protobuf:"bytes,3,opt,name=message"` -} - // SensorStatus contains information about the status of a sensor. type SensorStatus struct { // Phase is the high-level summary of the sensor @@ -459,9 +405,6 @@ type EventContext struct { // Enables a place for custom fields a producer or middleware might want to include and provides a place // to test metadata before adding them to the CloudEvents specification. Extensions map[string]string `json:"extensions,omitempty" protobuf:"bytes,9,rep,name=extensions"` - - // EscalationPolicy is the name of escalation policy to trigger in case the event filter fails - EscalationPolicy *EscalationPolicy `json:"escalationPolicy,omitempty" protobuf:"bytes,10,opt,name=escalationPolicy"` } // URI is a Uniform Resource Identifier based on RFC 3986 diff --git a/pkg/apis/sensor/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/sensor/v1alpha1/zz_generated.deepcopy.go index ecca437c40..dcf0118891 100644 --- a/pkg/apis/sensor/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/sensor/v1alpha1/zz_generated.deepcopy.go @@ -91,15 +91,10 @@ func (in *Data) DeepCopyInto(out *Data) { if (*in)[i] != nil { in, out := &(*in)[i], &(*out)[i] *out = new(DataFilter) - (*in).DeepCopyInto(*out) + **out = **in } } } - if in.EscalationPolicy != nil { - in, out := &in.EscalationPolicy, &out.EscalationPolicy - *out = new(EscalationPolicy) - **out = **in - } return } @@ -116,11 +111,6 @@ func (in *Data) DeepCopy() *Data { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *DataFilter) DeepCopyInto(out *DataFilter) { *out = *in - if in.EscalationPolicy != nil { - in, out := &in.EscalationPolicy, &out.EscalationPolicy - *out = new(EscalationPolicy) - **out = **in - } return } @@ -134,22 +124,6 @@ func (in *DataFilter) DeepCopy() *DataFilter { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *EscalationPolicy) DeepCopyInto(out *EscalationPolicy) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EscalationPolicy. -func (in *EscalationPolicy) DeepCopy() *EscalationPolicy { - if in == nil { - return nil - } - out := new(EscalationPolicy) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Event) DeepCopyInto(out *Event) { *out = *in @@ -193,11 +167,6 @@ func (in *EventContext) DeepCopyInto(out *EventContext) { (*out)[key] = val } } - if in.EscalationPolicy != nil { - in, out := &in.EscalationPolicy, &out.EscalationPolicy - *out = new(EscalationPolicy) - **out = **in - } return } @@ -234,7 +203,7 @@ func (in *EventDependencyFilter) DeepCopyInto(out *EventDependencyFilter) { if in.Time != nil { in, out := &in.Time, &out.Time *out = new(TimeFilter) - (*in).DeepCopyInto(*out) + **out = **in } if in.Context != nil { in, out := &in.Context, &out.Context @@ -651,11 +620,6 @@ func (in *SensorStatus) DeepCopy() *SensorStatus { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *TimeFilter) DeepCopyInto(out *TimeFilter) { *out = *in - if in.EscalationPolicy != nil { - in, out := &in.EscalationPolicy, &out.EscalationPolicy - *out = new(EscalationPolicy) - **out = **in - } return } diff --git a/sensors/event-handler.go b/sensors/event-handler.go index 017f873c8d..caa5c54ec4 100644 --- a/sensors/event-handler.go +++ b/sensors/event-handler.go @@ -144,9 +144,9 @@ func (sec *sensorExecutionCtx) WatchEventsFromGateways() { go sec.syncSensor(context.Background()) switch sec.sensor.Spec.EventProtocol.Type { - case v1alpha1.HTTP: + case common.HTTP: sec.HttpEventProtocol() - case v1alpha1.NATS: + case common.NATS: sec.NatsEventProtocol() var err error if sec.sensor, err = sn.PersistUpdates(sec.sensorClient, sec.sensor, sec.controllerInstanceID, &sec.log); err != nil { diff --git a/sensors/event-handler_test.go b/sensors/event-handler_test.go index f6c8e8f1dc..38f875dbdb 100644 --- a/sensors/event-handler_test.go +++ b/sensors/event-handler_test.go @@ -47,7 +47,7 @@ spec: imagePullPolicy: Always serviceAccountName: argo-events-sa dependencies: - - name: test-gateway/test + - name: test-gateway:test triggers: - name: test-workflow-trigger resource: @@ -136,10 +136,10 @@ func TestEventHandler(t *testing.T) { convey.So(err, convey.ShouldBeNil) sec.sensor.Status.Nodes = make(map[string]v1alpha1.NodeStatus) - fmt.Println(sensor.NodeID("test-gateway/test")) + fmt.Println(sensor.NodeID("test-gateway:test")) - sensor2.InitializeNode(sec.sensor, "test-gateway/test", v1alpha1.NodeTypeEventDependency, &sec.log, "node is init") - sensor2.MarkNodePhase(sec.sensor, "test-gateway/test", v1alpha1.NodeTypeEventDependency, v1alpha1.NodePhaseActive, nil, &sec.log, "node is active") + sensor2.InitializeNode(sec.sensor, "test-gateway:test", v1alpha1.NodeTypeEventDependency, &sec.log, "node is init") + sensor2.MarkNodePhase(sec.sensor, "test-gateway:test", v1alpha1.NodeTypeEventDependency, v1alpha1.NodePhaseActive, nil, &sec.log, "node is active") sensor2.InitializeNode(sec.sensor, "test-workflow-trigger", v1alpha1.NodeTypeTrigger, &sec.log, "trigger is init") @@ -148,21 +148,21 @@ func TestEventHandler(t *testing.T) { notificationType: v1alpha1.EventNotification, writer: &mockHttpWriter{}, eventDependency: &v1alpha1.EventDependency{ - Name: "test-gateway/test", + Name: "test-gateway:test", }, }) convey.Convey("Update sensor event dependencies", func() { sensor = sec.sensor.DeepCopy() sensor.Spec.Dependencies = append(sensor.Spec.Dependencies, v1alpha1.EventDependency{ - Name: "test-gateway/test2", + Name: "test-gateway:test2", }) sec.processUpdateNotification(&updateNotification{ event: nil, notificationType: v1alpha1.ResourceUpdateNotification, writer: &mockHttpWriter{}, eventDependency: &v1alpha1.EventDependency{ - Name: "test-gateway/test2", + Name: "test-gateway:test2", }, sensor: sensor, }) diff --git a/sensors/nats-events-handler.go b/sensors/nats-events-handler.go index f742a11eab..19781c5814 100644 --- a/sensors/nats-events-handler.go +++ b/sensors/nats-events-handler.go @@ -23,7 +23,6 @@ import ( "time" "github.com/argoproj/argo-events/common" - "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" "github.com/nats-io/go-nats" snats "github.com/nats-io/go-nats-streaming" ) @@ -59,7 +58,7 @@ func (sec *sensorExecutionCtx) successNatsSubscription(eventSource string) { labels := map[string]string{ common.LabelEventType: string(common.OperationSuccessEventType), common.LabelSensorName: sec.sensor.Name, - common.LabelEventSource: strings.Replace(eventSource, "/", "_", -1), + common.LabelEventSource: strings.Replace(eventSource, ":", "_", -1), common.LabelOperation: "nats_subscription_success", } if err := common.GenerateK8sEvent(sec.kubeClient, "nats subscription success", common.OperationSuccessEventType, "subscription setup", sec.sensor.Name, sec.sensor.Namespace, sec.controllerInstanceID, sensor.Kind, labels); err != nil { @@ -74,7 +73,7 @@ func (sec *sensorExecutionCtx) escalateNatsSubscriptionFailure(eventSource strin labels := map[string]string{ common.LabelEventType: string(common.OperationFailureEventType), common.LabelSensorName: sec.sensor.Name, - common.LabelEventSource: strings.Replace(eventSource, "/", "_", -1), + common.LabelEventSource: strings.Replace(eventSource, ":", "_", -1), common.LabelOperation: "nats_subscription_failure", } if err := common.GenerateK8sEvent(sec.kubeClient, "nats subscription failed", common.OperationFailureEventType, "subscription setup", sec.sensor.Name, sec.sensor.Namespace, sec.controllerInstanceID, sensor.Kind, labels); err != nil { @@ -93,7 +92,7 @@ func (sec *sensorExecutionCtx) NatsEventProtocol() { var err error switch sec.sensor.Spec.EventProtocol.Nats.Type { - case v1alpha1.Standard: + case common.Standard: if sec.nconn.standard == nil { sec.nconn.standard, err = nats.Connect(sec.sensor.Spec.EventProtocol.Nats.URL) if err != nil { @@ -119,7 +118,7 @@ func (sec *sensorExecutionCtx) NatsEventProtocol() { sec.successNatsSubscription(dependency.Name) } - case v1alpha1.Streaming: + case common.Streaming: if sec.nconn.stream == nil { sec.nconn.stream, err = snats.Connect(sec.sensor.Spec.EventProtocol.Nats.ClusterId, sec.sensor.Spec.EventProtocol.Nats.ClientId, snats.NatsURL(sec.sensor.Spec.EventProtocol.Nats.URL)) if err != nil { diff --git a/sensors/signal-filter_test.go b/sensors/signal-filter_test.go index bb8f45fa99..b72bb86598 100644 --- a/sensors/signal-filter_test.go +++ b/sensors/signal-filter_test.go @@ -28,11 +28,6 @@ import ( func Test_filterTime(t *testing.T) { timeFilter := &v1alpha1.TimeFilter{ - EscalationPolicy: &v1alpha1.EscalationPolicy{ - Name: "time filter escalation", - Message: "filter failed", - Level: v1alpha1.Alert, - }, Stop: "17:14:00", Start: "10:11:00", } From 7812d3b274a33f5714127ed17df8a0e2fde353f4 Mon Sep 17 00:00:00 2001 From: vpage Date: Tue, 22 Jan 2019 17:03:05 -0500 Subject: [PATCH 10/22] Fix storage grid channel issue --- gateways/custom/storagegrid/start.go | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/gateways/custom/storagegrid/start.go b/gateways/custom/storagegrid/start.go index 7f80726e69..bd2a5572e8 100644 --- a/gateways/custom/storagegrid/start.go +++ b/gateways/custom/storagegrid/start.go @@ -85,11 +85,8 @@ func init() { select { case config := <-routeActivateChan: // start server if it has not been started on this port - _, ok := activeServers[config.sgConfig.Port] - if !ok { - config.startHttpServer() - } - config.sgConfig.mux.HandleFunc(config.sgConfig.Endpoint, config.routeActiveHandler) + config.startHttpServer() + config.startCh <- struct{}{} case config := <-routeDeactivateChan: _, ok := activeServers[config.sgConfig.Port] @@ -216,8 +213,6 @@ func (ese *StorageGridEventSourceExecutor) StartEventSource(eventSource *gateway ese.Log.Info().Str("event-source-name", eventSource.Name).Str("port", sg.Port).Str("endpoint", sg.Endpoint).Msg("route handler added") - ese.Log.Info().Str("event-source-name", eventSource.Name).Str("port", sg.Port).Str("endpoint", sg.Endpoint).Msg("route handler added") - for { select { case data := <-activeEndpoints[rc.sgConfig.Endpoint].dataCh: @@ -270,6 +265,8 @@ func (rc *routeConfig) routeActiveHandler(writer http.ResponseWriter, request *h writer.Header().Add("Content-Type", "text/plain") writer.Write([]byte(respBody)) + rc.eventSourceExecutor.Log.Info().Str("body", string(body)).Msg("response body") + // notification received from storage grid is url encoded. parsedURL, err := url.QueryUnescape(string(body)) if err != nil { From 00d654c45f5886dab0ffaca2e49f6d8be6c3b1f7 Mon Sep 17 00:00:00 2001 From: vpage Date: Tue, 22 Jan 2019 18:17:06 -0500 Subject: [PATCH 11/22] Removing premature return in transformer --- gateways/transformer.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gateways/transformer.go b/gateways/transformer.go index f5e5ef1e23..779c741055 100644 --- a/gateways/transformer.go +++ b/gateways/transformer.go @@ -99,12 +99,12 @@ func (gc *GatewayConfig) dispatchEventOverHttp(source string, eventPayload []byt for _, sensor := range gc.gw.Spec.Watchers.Sensors { if err := gc.postCloudEventToWatcher(common.DefaultServiceName(sensor.Name), gc.gw.Spec.EventProtocol.Http.Port, common.SensorServiceEndpoint, eventPayload); err != nil { - return fmt.Errorf("failed to dispatch event to sensor watcher over http. communication error. err: %+v", err) + gc.Log.Warn().Str("event-source", source).Str("sensor-name", sensor.Name).Err(err).Msg("failed to dispatch event to sensor watcher over http. communication error") } } for _, gateway := range gc.gw.Spec.Watchers.Gateways { if err := gc.postCloudEventToWatcher(common.DefaultServiceName(gateway.Name), gateway.Port, gateway.Endpoint, eventPayload); err != nil { - return fmt.Errorf("failed to dispatch event to gateway watcher over http. communication error. err: %+v", err) + gc.Log.Warn().Str("event-source", source).Str("gateway-name", gateway.Name).Err(err).Msg("failed to dispatch event to gateway watcher over http. communication error") } } gc.Log.Info().Msg("successfully dispatched event to all watchers") From 3b51dcaf2d48aaca9ca41472ae75cd2fd21ddaee Mon Sep 17 00:00:00 2001 From: vpage Date: Tue, 22 Jan 2019 19:05:26 -0500 Subject: [PATCH 12/22] Renaming dispatchProtocol to eventProtocol --- Makefile | 2 +- common/common.go | 18 - common/events_test.go | 18 +- controllers/gateway/operator_test.go | 53 ++- controllers/gateway/validate.go | 2 +- controllers/sensor/operator.go | 5 +- controllers/sensor/operator_test.go | 6 +- controllers/sensor/validate.go | 9 +- gateways/config.go | 7 +- gateways/custom/storagegrid/validate_test.go | 6 +- gateways/transformer.go | 9 +- pkg/apis/gateway/v1alpha1/generated.pb.go | 234 +++++------ pkg/apis/gateway/v1alpha1/generated.proto | 4 +- .../gateway/v1alpha1/openapi_generated.go | 12 +- pkg/apis/gateway/v1alpha1/types.go | 6 +- .../gateway/v1alpha1/zz_generated.deepcopy.go | 8 +- pkg/apis/sensor/v1alpha1/generated.pb.go | 394 +++++++++--------- pkg/apis/sensor/v1alpha1/types.go | 2 +- pkg/common/common.go | 35 ++ sensors/event-handler.go | 5 +- sensors/nats-events-handler.go | 5 +- sensors/trigger.go | 1 + sensors/trigger_test.go | 3 +- 23 files changed, 443 insertions(+), 401 deletions(-) create mode 100644 pkg/common/common.go diff --git a/Makefile b/Makefile index 24aad1ba32..8757678e9d 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ override LDFLAGS += \ # docker image publishing options DOCKER_PUSH=true IMAGE_NAMESPACE=argoproj -IMAGE_TAG=v0.6.3 +IMAGE_TAG=v0.7 ifeq (${DOCKER_PUSH},true) ifndef IMAGE_NAMESPACE diff --git a/common/common.go b/common/common.go index b17e2507ab..de3f91d55f 100644 --- a/common/common.go +++ b/common/common.go @@ -21,24 +21,6 @@ import ( "github.com/argoproj/argo-events/pkg/apis/sensor" ) -// EventProtocolType is type of the event dispatch protocol. Used for dispatching events -type EventProtocolType string - -// possible types of event dispatch protocol -const ( - HTTP EventProtocolType = "HTTP" - NATS EventProtocolType = "NATS" -) - -// Type of nats connection. -type NatsType string - -// possible values of nats connection type -const ( - Standard NatsType = "Standard" - Streaming NatsType = "Streaming" -) - const ( // EnvVarKubeConfig is the path to the Kubernetes configuration EnvVarKubeConfig = "KUBE_CONFIG" diff --git a/common/events_test.go b/common/events_test.go index a2817114d1..de1f2c8c12 100644 --- a/common/events_test.go +++ b/common/events_test.go @@ -1,9 +1,25 @@ +/* +Copyright 2018 BlackRock, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package common import ( - "github.com/smartystreets/goconvey/convey" "testing" + "github.com/smartystreets/goconvey/convey" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes/fake" ) diff --git a/controllers/gateway/operator_test.go b/controllers/gateway/operator_test.go index 1a075c2434..597c4f9e16 100644 --- a/controllers/gateway/operator_test.go +++ b/controllers/gateway/operator_test.go @@ -34,42 +34,41 @@ metadata: gateways.argoproj.io/gateway-controller-instanceid: argo-events gateway-name: "webhook-gateway" spec: - configMap: "webhook-gateway-configmap" - type: "webhook" - dispatchProtocol: "HTTP" - eventVersion: "1.0" - processorPort: "9330" - deploySpec: + configMap: "webhook-gateway-configmap" + type: "webhook" + processorPort: "9330" + eventProtocol: + type: "NATS" + nats: + url: "nats://nats.argo-events:4222" + type: "Standard" + eventVersion: "1.0" + deploySpec: metadata: - name: webhook-gateway + name: "webhook-gateway" labels: - gateway-type: webhook - dispatch-mechanism: http + gateway-name: "webhook-gateway" spec: containers: - name: "gateway-client" - image: "argoproj/gateway-client:v0.7" + image: "argoproj/gateway-client:v0.6.2" imagePullPolicy: "Always" command: ["/bin/gateway-client"] - - name: "artifact-events" - image: "argoproj/webhook-gateway:v0.7" + - name: "webhook-events" + image: "argoproj/webhook-gateway:v0.6.2" imagePullPolicy: "Always" command: ["/bin/webhook-gateway"] - serviceSpec: - metadata: - name: webhook-gateway-svc - namespace: argo-events - spec: - selector: - gateway-type: "webhook-gateway" - dispatch-mechanism: http - ports: - - port: 12000 - targetPort: 12000 - type: LoadBalancer - watchers: - gateways: - - name: "webhook-gateway"` + serviceAccountName: "argo-events-sa" + serviceSpec: + metadata: + name: webhook-gateway-svc + spec: + selector: + gateway-name: "webhook-gateway" + ports: + - port: 12000 + targetPort: 12000 + type: LoadBalancer` func getGateway() (*v1alpha1.Gateway, error) { gwBytes := []byte(testGatewayStr) diff --git a/controllers/gateway/validate.go b/controllers/gateway/validate.go index 001b703ded..55b466b80e 100644 --- a/controllers/gateway/validate.go +++ b/controllers/gateway/validate.go @@ -18,8 +18,8 @@ package gateway import ( "fmt" - "github.com/argoproj/argo-events/common" "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1" + "github.com/argoproj/argo-events/pkg/common" ) // Validate validates the gateway resource. diff --git a/controllers/sensor/operator.go b/controllers/sensor/operator.go index c16ecc4994..c9c08a365f 100644 --- a/controllers/sensor/operator.go +++ b/controllers/sensor/operator.go @@ -17,11 +17,12 @@ limitations under the License. package sensor import ( - "github.com/argoproj/argo-events/pkg/apis/sensor" "time" "github.com/argoproj/argo-events/common" + "github.com/argoproj/argo-events/pkg/apis/sensor" "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" + pc "github.com/argoproj/argo-events/pkg/common" "github.com/rs/zerolog" corev1 "k8s.io/api/core/v1" apierr "k8s.io/apimachinery/pkg/api/errors" @@ -153,7 +154,7 @@ func (soc *sOperationCtx) operate() error { soc.log.Info().Msg("sensor pod created") // Create a ClusterIP service to expose sensor in cluster if the event protocol type is HTTP - if _, err = soc.controller.kubeClientset.CoreV1().Services(soc.s.Namespace).Get(common.DefaultServiceName(soc.s.Name), metav1.GetOptions{}); err != nil && apierr.IsNotFound(err) && soc.s.Spec.EventProtocol.Type == common.HTTP { + if _, err = soc.controller.kubeClientset.CoreV1().Services(soc.s.Namespace).Get(common.DefaultServiceName(soc.s.Name), metav1.GetOptions{}); err != nil && apierr.IsNotFound(err) && soc.s.Spec.EventProtocol.Type == pc.HTTP { // Create sensor service sensorSvc := &corev1.Service{ ObjectMeta: metav1.ObjectMeta{ diff --git a/controllers/sensor/operator_test.go b/controllers/sensor/operator_test.go index dbfde05844..2d322f7a7b 100644 --- a/controllers/sensor/operator_test.go +++ b/controllers/sensor/operator_test.go @@ -41,7 +41,11 @@ spec: imagePullPolicy: Always serviceAccountName: argo-events-sa dependencies: - - name: artifact-gateway/input + - name: artifact-gateway:input + eventProtocol: + type: "HTTP" + http: + port: "9300" triggers: - name: artifact-workflow-trigger resource: diff --git a/controllers/sensor/validate.go b/controllers/sensor/validate.go index 459311e23e..f036d598f6 100644 --- a/controllers/sensor/validate.go +++ b/controllers/sensor/validate.go @@ -22,6 +22,7 @@ import ( "github.com/argoproj/argo-events/common" "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" + pc "github.com/argoproj/argo-events/pkg/common" ) // ValidateSensor accepts a sensor and performs validation against it @@ -40,21 +41,21 @@ func ValidateSensor(s *v1alpha1.Sensor) error { return fmt.Errorf("sensor pod specification can't have more than one container") } switch s.Spec.EventProtocol.Type { - case common.HTTP: + case pc.HTTP: if s.Spec.EventProtocol.Http.Port == "" { return fmt.Errorf("http server port is not defined") } - case common.NATS: + case pc.NATS: if s.Spec.EventProtocol.Nats.URL == "" { return fmt.Errorf("nats url is not defined") } if s.Spec.EventProtocol.Nats.Type == "" { return fmt.Errorf("nats type is not defined. either Standard or Streaming type should be defined") } - if s.Spec.EventProtocol.Nats.Type == common.Streaming && s.Spec.EventProtocol.Nats.ClientId == "" { + if s.Spec.EventProtocol.Nats.Type == pc.Streaming && s.Spec.EventProtocol.Nats.ClientId == "" { return fmt.Errorf("client id must be specified when using nats streaming") } - if s.Spec.EventProtocol.Nats.Type == common.Streaming && s.Spec.EventProtocol.Nats.ClusterId == "" { + if s.Spec.EventProtocol.Nats.Type == pc.Streaming && s.Spec.EventProtocol.Nats.ClusterId == "" { return fmt.Errorf("cluster id must be specified when using nats streaming") } default: diff --git a/gateways/config.go b/gateways/config.go index 0715f511a9..574b8c0bd1 100644 --- a/gateways/config.go +++ b/gateways/config.go @@ -26,6 +26,7 @@ import ( "github.com/argoproj/argo-events/common" "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1" gwclientset "github.com/argoproj/argo-events/pkg/client/gateway/clientset/versioned" + pc "github.com/argoproj/argo-events/pkg/common" snats "github.com/nats-io/go-nats-streaming" "github.com/rs/zerolog" "google.golang.org/grpc" @@ -153,15 +154,15 @@ func NewGatewayConfiguration() *GatewayConfig { } switch gw.Spec.EventProtocol.Type { - case common.HTTP: + case pc.HTTP: gc.sensorHttpPort = gw.Spec.EventProtocol.Http.Port - case common.NATS: + case pc.NATS: if gc.natsConn, err = nats.Connect(gw.Spec.EventProtocol.Nats.URL); err != nil { panic(fmt.Errorf("failed to obtain NATS standard connection. err: %+v", err)) } gc.Log.Info().Str("nats-url", gw.Spec.EventProtocol.Nats.URL).Msg("connected to nats service") - if gc.gw.Spec.EventProtocol.Nats.Type == common.Streaming { + if gc.gw.Spec.EventProtocol.Nats.Type == pc.Streaming { gc.natsStreamingConn, err = snats.Connect(gc.gw.Spec.EventProtocol.Nats.ClusterId, gc.gw.Spec.EventProtocol.Nats.ClientId, snats.NatsConn(gc.natsConn)) if err != nil { panic(fmt.Errorf("failed to obtain NATS streaming connection. err: %+v", err)) diff --git a/gateways/custom/storagegrid/validate_test.go b/gateways/custom/storagegrid/validate_test.go index 5e48172a7f..9d5bcc089f 100644 --- a/gateways/custom/storagegrid/validate_test.go +++ b/gateways/custom/storagegrid/validate_test.go @@ -49,24 +49,22 @@ filter: func TestValidateStorageGridEventSource(t *testing.T) { convey.Convey("Given a valid storage grid event source spec, parse it and make sure no error occurs", t, func() { ese := &StorageGridEventSourceExecutor{} - valid, err := ese.ValidateEventSource(context.Background(), &gateways.EventSource{ + valid, _ := ese.ValidateEventSource(context.Background(), &gateways.EventSource{ Name: configKey, Id: configId, Data: validConfig, }) - convey.So(err, convey.ShouldBeNil) convey.So(valid, convey.ShouldNotBeNil) convey.So(valid.IsValid, convey.ShouldBeTrue) }) convey.Convey("Given an invalid storage grid event source spec, parse it and make sure error occurs", t, func() { ese := &StorageGridEventSourceExecutor{} - valid, err := ese.ValidateEventSource(context.Background(), &gateways.EventSource{ + valid, _ := ese.ValidateEventSource(context.Background(), &gateways.EventSource{ Data: invalidConfig, Id: configId, Name: configKey, }) - convey.So(err, convey.ShouldNotBeNil) convey.So(valid, convey.ShouldNotBeNil) convey.So(valid.IsValid, convey.ShouldBeFalse) convey.So(valid.Reason, convey.ShouldNotBeEmpty) diff --git a/gateways/transformer.go b/gateways/transformer.go index 779c741055..2c06bf97da 100644 --- a/gateways/transformer.go +++ b/gateways/transformer.go @@ -25,6 +25,7 @@ import ( "github.com/argoproj/argo-events/common" sv1alpha "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" + pc "github.com/argoproj/argo-events/pkg/common" suuid "github.com/satori/go.uuid" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -50,11 +51,11 @@ func (gc *GatewayConfig) DispatchEvent(gatewayEvent *Event) error { } switch gc.gw.Spec.EventProtocol.Type { - case common.HTTP: + case pc.HTTP: if err = gc.dispatchEventOverHttp(transformedEvent.Context.Source.Host, payload); err != nil { return err } - case common.NATS: + case pc.NATS: if err = gc.dispatchEventOverNats(transformedEvent.Context.Source.Host, payload); err != nil { return err } @@ -116,9 +117,9 @@ func (gc *GatewayConfig) dispatchEventOverNats(source string, eventPayload []byt var err error switch gc.gw.Spec.EventProtocol.Nats.Type { - case common.Standard: + case pc.Standard: err = gc.natsConn.Publish(source, eventPayload) - case common.Streaming: + case pc.Streaming: err = gc.natsStreamingConn.Publish(source, eventPayload) } diff --git a/pkg/apis/gateway/v1alpha1/generated.pb.go b/pkg/apis/gateway/v1alpha1/generated.pb.go index 115d94ab55..c81183990d 100644 --- a/pkg/apis/gateway/v1alpha1/generated.pb.go +++ b/pkg/apis/gateway/v1alpha1/generated.pb.go @@ -23,7 +23,7 @@ import math "math" import v11 "k8s.io/api/core/v1" -import github_com_argoproj_argo_events_common "github.com/argoproj/argo-events/common" +import github_com_argoproj_argo_events_pkg_common "github.com/argoproj/argo-events/pkg/common" import github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys" @@ -43,15 +43,15 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package -func (m *DispatchProtocol) Reset() { *m = DispatchProtocol{} } -func (*DispatchProtocol) ProtoMessage() {} -func (*DispatchProtocol) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_80114384d8f9498c, []int{0} +func (m *EventProtocol) Reset() { *m = EventProtocol{} } +func (*EventProtocol) ProtoMessage() {} +func (*EventProtocol) Descriptor() ([]byte, []int) { + return fileDescriptor_generated_8f30663b6aeb413e, []int{0} } -func (m *DispatchProtocol) XXX_Unmarshal(b []byte) error { +func (m *EventProtocol) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *DispatchProtocol) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *EventProtocol) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { b = b[:cap(b)] n, err := m.MarshalTo(b) if err != nil { @@ -59,22 +59,22 @@ func (m *DispatchProtocol) XXX_Marshal(b []byte, deterministic bool) ([]byte, er } return b[:n], nil } -func (dst *DispatchProtocol) XXX_Merge(src proto.Message) { - xxx_messageInfo_DispatchProtocol.Merge(dst, src) +func (dst *EventProtocol) XXX_Merge(src proto.Message) { + xxx_messageInfo_EventProtocol.Merge(dst, src) } -func (m *DispatchProtocol) XXX_Size() int { +func (m *EventProtocol) XXX_Size() int { return m.Size() } -func (m *DispatchProtocol) XXX_DiscardUnknown() { - xxx_messageInfo_DispatchProtocol.DiscardUnknown(m) +func (m *EventProtocol) XXX_DiscardUnknown() { + xxx_messageInfo_EventProtocol.DiscardUnknown(m) } -var xxx_messageInfo_DispatchProtocol proto.InternalMessageInfo +var xxx_messageInfo_EventProtocol proto.InternalMessageInfo func (m *Gateway) Reset() { *m = Gateway{} } func (*Gateway) ProtoMessage() {} func (*Gateway) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_80114384d8f9498c, []int{1} + return fileDescriptor_generated_8f30663b6aeb413e, []int{1} } func (m *Gateway) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -102,7 +102,7 @@ var xxx_messageInfo_Gateway proto.InternalMessageInfo func (m *GatewayList) Reset() { *m = GatewayList{} } func (*GatewayList) ProtoMessage() {} func (*GatewayList) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_80114384d8f9498c, []int{2} + return fileDescriptor_generated_8f30663b6aeb413e, []int{2} } func (m *GatewayList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -130,7 +130,7 @@ var xxx_messageInfo_GatewayList proto.InternalMessageInfo func (m *GatewayNotificationWatcher) Reset() { *m = GatewayNotificationWatcher{} } func (*GatewayNotificationWatcher) ProtoMessage() {} func (*GatewayNotificationWatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_80114384d8f9498c, []int{3} + return fileDescriptor_generated_8f30663b6aeb413e, []int{3} } func (m *GatewayNotificationWatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -158,7 +158,7 @@ var xxx_messageInfo_GatewayNotificationWatcher proto.InternalMessageInfo func (m *GatewaySpec) Reset() { *m = GatewaySpec{} } func (*GatewaySpec) ProtoMessage() {} func (*GatewaySpec) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_80114384d8f9498c, []int{4} + return fileDescriptor_generated_8f30663b6aeb413e, []int{4} } func (m *GatewaySpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -186,7 +186,7 @@ var xxx_messageInfo_GatewaySpec proto.InternalMessageInfo func (m *GatewayStatus) Reset() { *m = GatewayStatus{} } func (*GatewayStatus) ProtoMessage() {} func (*GatewayStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_80114384d8f9498c, []int{5} + return fileDescriptor_generated_8f30663b6aeb413e, []int{5} } func (m *GatewayStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -214,7 +214,7 @@ var xxx_messageInfo_GatewayStatus proto.InternalMessageInfo func (m *Http) Reset() { *m = Http{} } func (*Http) ProtoMessage() {} func (*Http) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_80114384d8f9498c, []int{6} + return fileDescriptor_generated_8f30663b6aeb413e, []int{6} } func (m *Http) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -242,7 +242,7 @@ var xxx_messageInfo_Http proto.InternalMessageInfo func (m *Nats) Reset() { *m = Nats{} } func (*Nats) ProtoMessage() {} func (*Nats) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_80114384d8f9498c, []int{7} + return fileDescriptor_generated_8f30663b6aeb413e, []int{7} } func (m *Nats) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -270,7 +270,7 @@ var xxx_messageInfo_Nats proto.InternalMessageInfo func (m *NodeStatus) Reset() { *m = NodeStatus{} } func (*NodeStatus) ProtoMessage() {} func (*NodeStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_80114384d8f9498c, []int{8} + return fileDescriptor_generated_8f30663b6aeb413e, []int{8} } func (m *NodeStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -298,7 +298,7 @@ var xxx_messageInfo_NodeStatus proto.InternalMessageInfo func (m *NotificationWatchers) Reset() { *m = NotificationWatchers{} } func (*NotificationWatchers) ProtoMessage() {} func (*NotificationWatchers) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_80114384d8f9498c, []int{9} + return fileDescriptor_generated_8f30663b6aeb413e, []int{9} } func (m *NotificationWatchers) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -326,7 +326,7 @@ var xxx_messageInfo_NotificationWatchers proto.InternalMessageInfo func (m *SensorNotificationWatcher) Reset() { *m = SensorNotificationWatcher{} } func (*SensorNotificationWatcher) ProtoMessage() {} func (*SensorNotificationWatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_80114384d8f9498c, []int{10} + return fileDescriptor_generated_8f30663b6aeb413e, []int{10} } func (m *SensorNotificationWatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -352,7 +352,7 @@ func (m *SensorNotificationWatcher) XXX_DiscardUnknown() { var xxx_messageInfo_SensorNotificationWatcher proto.InternalMessageInfo func init() { - proto.RegisterType((*DispatchProtocol)(nil), "github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.DispatchProtocol") + proto.RegisterType((*EventProtocol)(nil), "github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.EventProtocol") proto.RegisterType((*Gateway)(nil), "github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.Gateway") proto.RegisterType((*GatewayList)(nil), "github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.GatewayList") proto.RegisterType((*GatewayNotificationWatcher)(nil), "github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.GatewayNotificationWatcher") @@ -365,7 +365,7 @@ func init() { proto.RegisterType((*NotificationWatchers)(nil), "github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.NotificationWatchers") proto.RegisterType((*SensorNotificationWatcher)(nil), "github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.SensorNotificationWatcher") } -func (m *DispatchProtocol) Marshal() (dAtA []byte, err error) { +func (m *EventProtocol) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalTo(dAtA) @@ -375,7 +375,7 @@ func (m *DispatchProtocol) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *DispatchProtocol) MarshalTo(dAtA []byte) (int, error) { +func (m *EventProtocol) MarshalTo(dAtA []byte) (int, error) { var i int _ = i var l int @@ -833,7 +833,7 @@ func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return offset + 1 } -func (m *DispatchProtocol) Size() (n int) { +func (m *EventProtocol) Size() (n int) { if m == nil { return 0 } @@ -1046,11 +1046,11 @@ func sovGenerated(x uint64) (n int) { func sozGenerated(x uint64) (n int) { return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } -func (this *DispatchProtocol) String() string { +func (this *EventProtocol) String() string { if this == nil { return "nil" } - s := strings.Join([]string{`&DispatchProtocol{`, + s := strings.Join([]string{`&EventProtocol{`, `Type:` + fmt.Sprintf("%v", this.Type) + `,`, `Http:` + strings.Replace(strings.Replace(this.Http.String(), "Http", "Http", 1), `&`, ``, 1) + `,`, `Nats:` + strings.Replace(strings.Replace(this.Nats.String(), "Nats", "Nats", 1), `&`, ``, 1) + `,`, @@ -1105,7 +1105,7 @@ func (this *GatewaySpec) String() string { `ServiceSpec:` + strings.Replace(fmt.Sprintf("%v", this.ServiceSpec), "Service", "v11.Service", 1) + `,`, `Watchers:` + strings.Replace(fmt.Sprintf("%v", this.Watchers), "NotificationWatchers", "NotificationWatchers", 1) + `,`, `ProcessorPort:` + fmt.Sprintf("%v", this.ProcessorPort) + `,`, - `EventProtocol:` + strings.Replace(strings.Replace(this.EventProtocol.String(), "DispatchProtocol", "DispatchProtocol", 1), `&`, ``, 1) + `,`, + `EventProtocol:` + strings.Replace(strings.Replace(this.EventProtocol.String(), "EventProtocol", "EventProtocol", 1), `&`, ``, 1) + `,`, `}`, }, "") return s @@ -1201,7 +1201,7 @@ func valueToStringGenerated(v interface{}) string { pv := reflect.Indirect(rv).Interface() return fmt.Sprintf("*%v", pv) } -func (m *DispatchProtocol) Unmarshal(dAtA []byte) error { +func (m *EventProtocol) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -1224,10 +1224,10 @@ func (m *DispatchProtocol) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: DispatchProtocol: wiretype end group for non-group") + return fmt.Errorf("proto: EventProtocol: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: DispatchProtocol: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: EventProtocol: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -1257,7 +1257,7 @@ func (m *DispatchProtocol) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Type = github_com_argoproj_argo_events_common.EventProtocolType(dAtA[iNdEx:postIndex]) + m.Type = github_com_argoproj_argo_events_pkg_common.EventProtocolType(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { @@ -2448,7 +2448,7 @@ func (m *Nats) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Type = github_com_argoproj_argo_events_common.NatsType(dAtA[iNdEx:postIndex]) + m.Type = github_com_argoproj_argo_events_pkg_common.NatsType(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: if wireType != 2 { @@ -3081,86 +3081,86 @@ var ( ) func init() { - proto.RegisterFile("github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1/generated.proto", fileDescriptor_generated_80114384d8f9498c) -} - -var fileDescriptor_generated_80114384d8f9498c = []byte{ - // 1222 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0x4d, 0x6f, 0x1b, 0x45, - 0x18, 0xce, 0xfa, 0x23, 0xb6, 0xc7, 0x49, 0x1b, 0x86, 0x22, 0x8c, 0x11, 0x4e, 0xb5, 0xa7, 0x80, - 0xda, 0xdd, 0xb6, 0x7c, 0x28, 0x80, 0x50, 0x85, 0x9b, 0xd0, 0x44, 0x34, 0x69, 0x34, 0x4e, 0x40, - 0xa2, 0x95, 0xe8, 0x64, 0x77, 0xb2, 0xde, 0xc6, 0xbb, 0x33, 0xda, 0x19, 0xbb, 0xf8, 0x54, 0x24, - 0xee, 0x15, 0x7f, 0x80, 0x23, 0x7f, 0x81, 0x5f, 0x80, 0x44, 0x8e, 0x3d, 0x70, 0x28, 0x97, 0x88, - 0x98, 0x7f, 0x51, 0x71, 0x40, 0x33, 0x3b, 0xfb, 0x91, 0x38, 0x56, 0x4c, 0xdd, 0x9b, 0x67, 0xe6, - 0x79, 0x9f, 0x77, 0xde, 0xaf, 0x67, 0xc7, 0x60, 0xd3, 0xf3, 0x45, 0xb7, 0xbf, 0x6f, 0x39, 0x34, - 0xb0, 0x71, 0xe4, 0x51, 0x16, 0xd1, 0xc7, 0xea, 0xc7, 0x75, 0x32, 0x20, 0xa1, 0xe0, 0x36, 0x3b, - 0xf4, 0x6c, 0xcc, 0x7c, 0x6e, 0x7b, 0x58, 0x90, 0x27, 0x78, 0x68, 0x0f, 0x6e, 0xe2, 0x1e, 0xeb, - 0xe2, 0x9b, 0xb6, 0x47, 0x42, 0x12, 0x61, 0x41, 0x5c, 0x8b, 0x45, 0x54, 0x50, 0xf8, 0x69, 0x46, - 0x65, 0x25, 0x54, 0xea, 0xc7, 0xf7, 0x31, 0x95, 0xc5, 0x0e, 0x3d, 0x4b, 0x52, 0x59, 0x9a, 0xca, - 0x4a, 0xa8, 0x9a, 0x1b, 0x53, 0xdf, 0x82, 0x93, 0x90, 0xd3, 0x68, 0xe2, 0x25, 0x9a, 0xd7, 0x73, - 0x4c, 0x1e, 0xf5, 0xa8, 0xad, 0xb6, 0xf7, 0xfb, 0x07, 0x6a, 0xa5, 0x16, 0xea, 0x97, 0x86, 0x9b, - 0x87, 0xab, 0xdc, 0xf2, 0xa9, 0xe4, 0xb6, 0x1d, 0x1a, 0x11, 0x7b, 0x30, 0x4e, 0xf9, 0x51, 0x86, - 0x09, 0xb0, 0xd3, 0xf5, 0x43, 0x12, 0x0d, 0xb3, 0x0b, 0x05, 0x44, 0xe0, 0xf3, 0xac, 0xec, 0x49, - 0x56, 0x51, 0x3f, 0x14, 0x7e, 0x40, 0xc6, 0x0c, 0x3e, 0xb9, 0xc8, 0x80, 0x3b, 0x5d, 0x12, 0xe0, - 0x31, 0xbb, 0x0f, 0x27, 0xd9, 0xf5, 0x85, 0xdf, 0xb3, 0xfd, 0x50, 0x70, 0x11, 0x9d, 0x35, 0x32, - 0x7f, 0x2b, 0x80, 0xa5, 0x35, 0x9f, 0x33, 0x2c, 0x9c, 0xee, 0x8e, 0xdc, 0x71, 0x68, 0x0f, 0x3e, - 0x04, 0x25, 0x31, 0x64, 0xa4, 0x61, 0x5c, 0x35, 0x56, 0x6a, 0xed, 0x8d, 0xa3, 0xe3, 0xe5, 0xb9, - 0xd1, 0xf1, 0x72, 0x69, 0x77, 0xc8, 0xc8, 0xcb, 0xe3, 0xe5, 0xd5, 0x8b, 0x6a, 0xe4, 0xd0, 0x20, - 0xa0, 0xa1, 0xb5, 0x2e, 0x57, 0x09, 0xa7, 0xb4, 0x45, 0x8a, 0x15, 0x62, 0x50, 0xea, 0x0a, 0xc1, - 0x1a, 0x85, 0xab, 0xc6, 0x4a, 0xfd, 0xd6, 0x6d, 0xeb, 0x95, 0xbb, 0xc5, 0xda, 0x10, 0x82, 0xb5, - 0x17, 0x92, 0xeb, 0xc9, 0x15, 0x52, 0xd4, 0xd2, 0x45, 0x88, 0x05, 0x6f, 0x14, 0x67, 0x76, 0xb1, - 0x8d, 0x05, 0xcf, 0x5c, 0xc8, 0x15, 0x52, 0xd4, 0xe6, 0x1f, 0x05, 0x50, 0xb9, 0x1b, 0xa3, 0xe1, - 0x23, 0x50, 0x95, 0xd5, 0x77, 0xb1, 0xc0, 0x2a, 0x67, 0xf5, 0x5b, 0x37, 0xac, 0xb8, 0x18, 0x56, - 0xbe, 0x18, 0x99, 0x1b, 0x89, 0xb6, 0x06, 0x37, 0xad, 0xfb, 0xfb, 0x8f, 0x89, 0x23, 0xb6, 0x88, - 0xc0, 0x6d, 0xa8, 0x7d, 0x80, 0x6c, 0x0f, 0xa5, 0xac, 0x90, 0x81, 0x79, 0x2e, 0xb0, 0xe8, 0x73, - 0x9d, 0xb5, 0x8d, 0x19, 0x42, 0xd2, 0xb7, 0xee, 0x28, 0xbe, 0xf6, 0x25, 0xed, 0x77, 0x3e, 0x5e, - 0x23, 0xed, 0x07, 0x76, 0x41, 0x89, 0x33, 0xe2, 0xe8, 0x14, 0x7e, 0xf5, 0x1a, 0xfc, 0x31, 0xe2, - 0x64, 0x99, 0x94, 0x2b, 0xa4, 0x3c, 0x98, 0x7f, 0x1a, 0xa0, 0xae, 0x31, 0xf7, 0x7c, 0x2e, 0xe0, - 0xc3, 0xb1, 0x6c, 0x5a, 0xd3, 0x65, 0x53, 0x5a, 0xab, 0x5c, 0x2e, 0x69, 0x2f, 0xd5, 0x64, 0x27, - 0x97, 0x49, 0x0f, 0x94, 0x7d, 0x41, 0x02, 0x99, 0xc8, 0xe2, 0x4a, 0xfd, 0x56, 0x7b, 0xf6, 0xc0, - 0xda, 0x8b, 0xda, 0x5d, 0x79, 0x53, 0x12, 0xa3, 0x98, 0xdf, 0x7c, 0x66, 0x80, 0xa6, 0x46, 0x6c, - 0x53, 0xe1, 0x1f, 0xf8, 0x0e, 0x16, 0x3e, 0x0d, 0xbf, 0x95, 0x93, 0x46, 0x22, 0x78, 0x55, 0xb6, - 0x68, 0x90, 0xcc, 0x58, 0xae, 0xc3, 0x02, 0x82, 0xd4, 0x89, 0x44, 0x30, 0x1a, 0x09, 0x55, 0xf1, - 0x1c, 0x62, 0x87, 0x46, 0x02, 0xa9, 0x13, 0x78, 0x0d, 0x54, 0x49, 0xe8, 0x32, 0xea, 0x87, 0x42, - 0xd5, 0xa9, 0x96, 0x45, 0xbe, 0xae, 0xf7, 0x51, 0x8a, 0x30, 0xff, 0x2d, 0xa5, 0x79, 0x96, 0xd9, - 0x87, 0x77, 0x01, 0x70, 0x09, 0xeb, 0x51, 0xb5, 0xd2, 0x99, 0x7e, 0x3b, 0x97, 0x69, 0x4b, 0xea, - 0xa0, 0xcc, 0xeb, 0x0e, 0x75, 0xdb, 0x97, 0x64, 0x6b, 0xae, 0xa5, 0x70, 0x94, 0x33, 0x85, 0x36, - 0xa8, 0x39, 0x34, 0x3c, 0xf0, 0xbd, 0x00, 0x33, 0x7d, 0xdb, 0x37, 0xf4, 0x3d, 0x6a, 0x77, 0xd4, - 0xc1, 0x16, 0x66, 0x28, 0xc3, 0xc8, 0xc8, 0x94, 0xbe, 0x14, 0x4f, 0x47, 0x96, 0xd3, 0x88, 0x55, - 0xb0, 0xa0, 0xd2, 0xff, 0x0d, 0x89, 0xb8, 0x4f, 0xc3, 0x46, 0x49, 0x21, 0xaf, 0x68, 0xe4, 0xc2, - 0x7a, 0xee, 0x0c, 0x9d, 0x42, 0xc2, 0x6d, 0x50, 0xe7, 0x24, 0x1a, 0xf8, 0x0e, 0x51, 0x61, 0x95, - 0x55, 0x58, 0xef, 0x9e, 0x17, 0x56, 0x27, 0x86, 0xb5, 0x2f, 0x8f, 0x8e, 0x97, 0xeb, 0x9d, 0xcc, - 0x06, 0xe5, 0x09, 0xe0, 0x10, 0x54, 0x9f, 0xc4, 0x25, 0xe3, 0x8d, 0x79, 0x45, 0x76, 0x7f, 0x16, - 0x39, 0x19, 0xef, 0x04, 0xde, 0x5e, 0x90, 0x05, 0x4b, 0x56, 0x28, 0x75, 0x07, 0x3f, 0x07, 0x8b, - 0x2c, 0xa2, 0x0e, 0xe1, 0x9c, 0x46, 0xb2, 0xea, 0x8d, 0x8a, 0xca, 0xc2, 0x5b, 0x3a, 0x0b, 0x8b, - 0x3b, 0xf9, 0x43, 0x74, 0x1a, 0x0b, 0x9f, 0x19, 0x60, 0xc9, 0x3d, 0x23, 0xec, 0x8d, 0xaa, 0x0a, - 0xe0, 0xeb, 0x19, 0x02, 0x38, 0xfb, 0xad, 0xc8, 0x6e, 0x73, 0x4a, 0xee, 0xd1, 0x98, 0x6f, 0xf3, - 0xf7, 0x22, 0x58, 0x3c, 0x25, 0x3d, 0xf0, 0x06, 0x28, 0xb3, 0x2e, 0xe6, 0xc9, 0x0c, 0x34, 0x93, - 0x31, 0xda, 0x91, 0x9b, 0x2f, 0x8f, 0x97, 0x6b, 0xdb, 0xd4, 0x25, 0x6a, 0x81, 0x62, 0x20, 0x7c, - 0x00, 0x6a, 0x5c, 0xe0, 0x48, 0x10, 0xf7, 0x4b, 0xa1, 0x95, 0xf0, 0x83, 0xe9, 0xb4, 0x61, 0xd7, - 0x0f, 0x48, 0xd6, 0x95, 0x9d, 0x84, 0x04, 0x65, 0x7c, 0xf0, 0x7d, 0x50, 0x09, 0x08, 0xe7, 0xd8, - 0x23, 0xba, 0xdd, 0x2e, 0x6b, 0x78, 0x65, 0x2b, 0xde, 0x46, 0xc9, 0x39, 0xfc, 0x01, 0x94, 0x43, - 0xea, 0x12, 0xde, 0x28, 0x2b, 0x11, 0xe9, 0xbc, 0x2e, 0x35, 0xb6, 0x64, 0xc4, 0x7c, 0x3d, 0x14, - 0x51, 0x4e, 0x55, 0xd4, 0x1e, 0x8a, 0x1d, 0x36, 0x9f, 0x02, 0x90, 0x61, 0xe0, 0x12, 0x28, 0x1e, - 0x92, 0x61, 0x9c, 0x3f, 0x24, 0x7f, 0xc2, 0x07, 0xa0, 0x3c, 0xc0, 0xbd, 0x3e, 0xd1, 0xd9, 0x59, - 0x9f, 0xa9, 0x57, 0x5d, 0xa2, 0x3f, 0x0a, 0x31, 0xe7, 0x67, 0x85, 0x55, 0xc3, 0x5c, 0x01, 0xea, - 0x43, 0x9b, 0xaa, 0x93, 0x31, 0x49, 0x9d, 0xcc, 0xbf, 0x0c, 0xa0, 0x3e, 0x98, 0xf0, 0x3d, 0x50, - 0xec, 0x47, 0x3d, 0x8d, 0xac, 0x6b, 0x64, 0x71, 0x0f, 0xdd, 0x43, 0x72, 0x1f, 0x76, 0xb4, 0x1a, - 0xc4, 0xca, 0x71, 0xfb, 0xcc, 0x6b, 0xc3, 0x9e, 0xf2, 0xb5, 0x21, 0x3d, 0xe5, 0x04, 0xe4, 0x1a, - 0xa8, 0x3a, 0x3d, 0x9f, 0x84, 0x62, 0xd3, 0x3d, 0x2b, 0x8d, 0x77, 0xf4, 0x3e, 0x4a, 0x11, 0x4a, - 0xc1, 0x7a, 0x7d, 0x2e, 0x48, 0xb4, 0xe9, 0xea, 0xe2, 0x67, 0x0a, 0x96, 0x1c, 0xa0, 0x0c, 0x63, - 0xfe, 0x5a, 0x8c, 0xeb, 0xa0, 0x3b, 0xb9, 0x09, 0x0a, 0xbe, 0xab, 0x03, 0x04, 0xda, 0xb0, 0xb0, - 0xb9, 0x86, 0x0a, 0xbe, 0x9b, 0x0a, 0x7d, 0x71, 0xa2, 0xd0, 0x7f, 0x0c, 0xea, 0x72, 0x5a, 0x7a, - 0x78, 0x28, 0x37, 0x95, 0x64, 0xd5, 0xda, 0x6f, 0x6a, 0x60, 0x7d, 0x2d, 0x3b, 0x42, 0x79, 0x5c, - 0x36, 0x3e, 0xf3, 0xd3, 0x8e, 0xcf, 0xa3, 0xfc, 0xf8, 0x54, 0x54, 0x83, 0xd8, 0xd3, 0x8d, 0xcf, - 0x96, 0xef, 0x44, 0xf4, 0xff, 0xcd, 0x50, 0xf5, 0x82, 0x19, 0x72, 0x00, 0xe8, 0x33, 0x17, 0x0b, - 0x22, 0x69, 0x1b, 0xb5, 0x57, 0xbb, 0x4d, 0xfa, 0x6a, 0xda, 0x4b, 0xa9, 0x50, 0x8e, 0xd6, 0xfc, - 0xa5, 0x00, 0xae, 0x9c, 0xa7, 0xb9, 0xf0, 0x27, 0x03, 0x54, 0x75, 0xc7, 0xf3, 0x86, 0xa1, 0xa6, - 0x78, 0x6f, 0xf6, 0x29, 0x3e, 0xc7, 0x55, 0xd6, 0x77, 0x1a, 0xc3, 0x51, 0xea, 0x18, 0x3e, 0x05, - 0x95, 0xf8, 0x7f, 0x4c, 0xf2, 0x1c, 0xd9, 0x9d, 0xe1, 0x0e, 0x1d, 0xc5, 0x74, 0xde, 0x15, 0xd2, - 0x22, 0xc4, 0x10, 0x8e, 0x12, 0xaf, 0xe6, 0x17, 0xe0, 0x9d, 0x89, 0x66, 0x17, 0x3f, 0x51, 0xda, - 0xd6, 0xd1, 0x49, 0x6b, 0xee, 0xf9, 0x49, 0x6b, 0xee, 0xc5, 0x49, 0x6b, 0xee, 0xc7, 0x51, 0xcb, - 0x38, 0x1a, 0xb5, 0x8c, 0xe7, 0xa3, 0x96, 0xf1, 0x62, 0xd4, 0x32, 0xfe, 0x1e, 0xb5, 0x8c, 0x9f, - 0xff, 0x69, 0xcd, 0x7d, 0x57, 0x4d, 0xae, 0xf8, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xaf, 0xad, - 0x3d, 0x00, 0x65, 0x0e, 0x00, 0x00, + proto.RegisterFile("github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1/generated.proto", fileDescriptor_generated_8f30663b6aeb413e) +} + +var fileDescriptor_generated_8f30663b6aeb413e = []byte{ + // 1217 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0x4f, 0x6f, 0x1b, 0x45, + 0x14, 0xcf, 0xfa, 0x4f, 0x6c, 0x8f, 0xe3, 0xb6, 0x0c, 0x45, 0x18, 0x23, 0x9c, 0x68, 0x4f, 0x01, + 0xb5, 0xbb, 0x4d, 0x0a, 0x28, 0xfc, 0x13, 0xc2, 0x49, 0x68, 0x22, 0x25, 0x69, 0x34, 0x4e, 0xa8, + 0x44, 0x91, 0xc8, 0x64, 0x77, 0xb2, 0xde, 0xc6, 0xbb, 0xb3, 0xda, 0x19, 0xbb, 0xf8, 0x54, 0x24, + 0xc4, 0x15, 0xf1, 0x05, 0x38, 0xf2, 0x19, 0xf8, 0x02, 0x48, 0xe4, 0xd8, 0x03, 0x87, 0x5e, 0x88, + 0x88, 0xf9, 0x08, 0xdc, 0x7a, 0xaa, 0x66, 0x76, 0xf6, 0x8f, 0x93, 0x58, 0x71, 0xeb, 0xde, 0x76, + 0xde, 0xfc, 0xde, 0xef, 0xbd, 0x79, 0xef, 0xcd, 0xcf, 0x63, 0xb0, 0xe9, 0xb8, 0xbc, 0xd3, 0x3b, + 0x34, 0x2c, 0xea, 0x99, 0x38, 0x74, 0x68, 0x10, 0xd2, 0x47, 0xf2, 0xe3, 0x36, 0xe9, 0x13, 0x9f, + 0x33, 0x33, 0x38, 0x76, 0x4c, 0x1c, 0xb8, 0xcc, 0x74, 0x30, 0x27, 0x8f, 0xf1, 0xc0, 0xec, 0x2f, + 0xe1, 0x6e, 0xd0, 0xc1, 0x4b, 0xa6, 0x43, 0x7c, 0x12, 0x62, 0x4e, 0x6c, 0x23, 0x08, 0x29, 0xa7, + 0xf0, 0x93, 0x94, 0xca, 0x88, 0xa9, 0xe4, 0xc7, 0xf7, 0x11, 0x95, 0x11, 0x1c, 0x3b, 0x86, 0xa0, + 0x32, 0x14, 0x95, 0x11, 0x53, 0x35, 0x36, 0x26, 0xce, 0x82, 0x11, 0x9f, 0xd1, 0x70, 0x6c, 0x12, + 0x8d, 0xdb, 0x19, 0x26, 0x87, 0x3a, 0xd4, 0x94, 0xe6, 0xc3, 0xde, 0x91, 0x5c, 0xc9, 0x85, 0xfc, + 0x52, 0x70, 0xfd, 0x78, 0x85, 0x19, 0x2e, 0x15, 0xdc, 0xa6, 0x45, 0x43, 0x62, 0xf6, 0x2f, 0x52, + 0x7e, 0x98, 0x62, 0x3c, 0x6c, 0x75, 0x5c, 0x9f, 0x84, 0x83, 0x34, 0x21, 0x8f, 0x70, 0x7c, 0x99, + 0x97, 0x39, 0xce, 0x2b, 0xec, 0xf9, 0xdc, 0xf5, 0xc8, 0x05, 0x87, 0x8f, 0xaf, 0x72, 0x60, 0x56, + 0x87, 0x78, 0xf8, 0x82, 0xdf, 0xdd, 0x71, 0x7e, 0x3d, 0xee, 0x76, 0x4d, 0xd7, 0xe7, 0x8c, 0x87, + 0xe7, 0x9d, 0xf4, 0x3f, 0x72, 0xa0, 0xb6, 0x2e, 0x4a, 0xbb, 0x2b, 0x96, 0x16, 0xed, 0xc2, 0x03, + 0x50, 0xe0, 0x83, 0x80, 0xd4, 0xb5, 0x05, 0x6d, 0xb1, 0xd2, 0xda, 0x3a, 0x39, 0x9d, 0x9f, 0x19, + 0x9e, 0xce, 0x17, 0xf6, 0x06, 0x01, 0x79, 0x7e, 0x3a, 0xff, 0xf9, 0x24, 0x0d, 0xb2, 0xa8, 0xe7, + 0x51, 0xdf, 0x18, 0xe1, 0x15, 0xfe, 0x48, 0x32, 0x43, 0x0c, 0x0a, 0x1d, 0xce, 0x83, 0x7a, 0x6e, + 0x41, 0x5b, 0xac, 0x2e, 0x7f, 0x69, 0xbc, 0xf2, 0xb8, 0x18, 0x1b, 0x9c, 0x07, 0xad, 0xb9, 0x38, + 0x45, 0xb1, 0x42, 0x92, 0x5a, 0x84, 0xf0, 0x31, 0x67, 0xf5, 0xfc, 0xd4, 0x21, 0x76, 0x30, 0x67, + 0x69, 0x08, 0xb1, 0x42, 0x92, 0x5a, 0xff, 0x2b, 0x07, 0x4a, 0xf7, 0x22, 0x34, 0x3c, 0x00, 0x65, + 0xd1, 0x7e, 0x1b, 0x73, 0x2c, 0xeb, 0x56, 0x5d, 0xbe, 0x63, 0x44, 0xdd, 0x30, 0xb2, 0xdd, 0x48, + 0xc3, 0x08, 0xb4, 0xd1, 0x5f, 0x32, 0xee, 0x1f, 0x3e, 0x22, 0x16, 0xdf, 0x26, 0x1c, 0xb7, 0xa0, + 0x8a, 0x01, 0x52, 0x1b, 0x4a, 0x58, 0x61, 0x00, 0x66, 0x19, 0xc7, 0xbc, 0xc7, 0x54, 0xd5, 0x36, + 0xa6, 0x38, 0x92, 0xca, 0xba, 0x2d, 0xf9, 0x5a, 0xd7, 0x54, 0xdc, 0xd9, 0x68, 0x8d, 0x54, 0x1c, + 0xd8, 0x01, 0x05, 0x16, 0x10, 0x4b, 0x95, 0xf0, 0xeb, 0xd7, 0x10, 0x2f, 0x20, 0x56, 0x5a, 0x49, + 0xb1, 0x42, 0x32, 0x82, 0xfe, 0xb7, 0x06, 0xaa, 0x0a, 0xb3, 0xe5, 0x32, 0x0e, 0xbf, 0xbb, 0x50, + 0x4d, 0x63, 0xb2, 0x6a, 0x0a, 0x6f, 0x59, 0xcb, 0x1b, 0x2a, 0x4a, 0x39, 0xb6, 0x64, 0x2a, 0xe9, + 0x80, 0xa2, 0xcb, 0x89, 0x27, 0x0a, 0x99, 0x5f, 0xac, 0x2e, 0xb7, 0xa6, 0x3f, 0x58, 0xab, 0xa6, + 0xc2, 0x15, 0x37, 0x05, 0x31, 0x8a, 0xf8, 0xf5, 0x5f, 0x34, 0xd0, 0x50, 0x88, 0x1d, 0xca, 0xdd, + 0x23, 0xd7, 0xc2, 0xdc, 0xa5, 0xfe, 0x03, 0xcc, 0xad, 0x0e, 0x09, 0xe1, 0x82, 0x18, 0x51, 0x2f, + 0xbe, 0x67, 0x99, 0x09, 0xf3, 0x08, 0x92, 0x3b, 0x02, 0x11, 0xd0, 0x90, 0xcb, 0x8e, 0x67, 0x10, + 0xbb, 0x34, 0xe4, 0x48, 0xee, 0xc0, 0x5b, 0xa0, 0x4c, 0x7c, 0x3b, 0xa0, 0xae, 0xcf, 0x65, 0x9f, + 0x2a, 0xe9, 0xc9, 0xd7, 0x95, 0x1d, 0x25, 0x08, 0xfd, 0xff, 0x42, 0x52, 0x67, 0x51, 0x7d, 0x78, + 0x0f, 0x00, 0x9b, 0x04, 0x5d, 0x2a, 0x57, 0xaa, 0xd2, 0x6f, 0x67, 0x2a, 0x6d, 0x08, 0x21, 0x14, + 0x75, 0xdd, 0xa5, 0x76, 0xeb, 0x9a, 0x18, 0xcd, 0xb5, 0x04, 0x8e, 0x32, 0xae, 0xd0, 0x04, 0x15, + 0x8b, 0xfa, 0x47, 0xae, 0xe3, 0xe1, 0x40, 0x65, 0xfb, 0x86, 0xca, 0xa3, 0xb2, 0x2a, 0x37, 0xb6, + 0x71, 0x80, 0x52, 0x8c, 0x38, 0x99, 0xd4, 0x98, 0xfc, 0xe8, 0xc9, 0x32, 0x1a, 0xb1, 0x02, 0xe6, + 0x64, 0xf9, 0xbf, 0x21, 0x21, 0x73, 0xa9, 0x5f, 0x2f, 0x48, 0xe4, 0x4d, 0x85, 0x9c, 0x5b, 0xcf, + 0xec, 0xa1, 0x11, 0x24, 0xdc, 0x01, 0x55, 0x46, 0xc2, 0xbe, 0x6b, 0x11, 0x79, 0xac, 0xa2, 0x3c, + 0xd6, 0xbb, 0x97, 0x1d, 0xab, 0x1d, 0xc1, 0x5a, 0xd7, 0x87, 0xa7, 0xf3, 0xd5, 0x76, 0xea, 0x83, + 0xb2, 0x04, 0x70, 0x00, 0xca, 0x8f, 0xa3, 0x96, 0xb1, 0xfa, 0xac, 0x24, 0xbb, 0x3f, 0x8d, 0x9c, + 0x5c, 0x9c, 0x04, 0xd6, 0x9a, 0x13, 0x0d, 0x8b, 0x57, 0x28, 0x09, 0x07, 0x3f, 0x03, 0xb5, 0x20, + 0xa4, 0x16, 0x61, 0x8c, 0x86, 0xa2, 0xeb, 0xf5, 0x92, 0xac, 0xc2, 0x5b, 0xaa, 0x0a, 0xb5, 0xdd, + 0xec, 0x26, 0x1a, 0xc5, 0xc2, 0x9f, 0x35, 0x50, 0x23, 0x59, 0x05, 0xae, 0x97, 0xa7, 0x56, 0x8e, + 0x11, 0x45, 0x4f, 0xf3, 0x18, 0x31, 0xa3, 0xd1, 0xa8, 0xfa, 0x9f, 0x79, 0x50, 0x1b, 0x51, 0x1c, + 0x78, 0x07, 0x14, 0x83, 0x0e, 0x66, 0xf1, 0xe8, 0x37, 0xe2, 0xdb, 0xb3, 0x2b, 0x8c, 0xcf, 0x4f, + 0xe7, 0x2b, 0x3b, 0xd4, 0x26, 0x72, 0x81, 0x22, 0x20, 0x7c, 0x08, 0x2a, 0x8c, 0xe3, 0x90, 0x13, + 0xfb, 0x2b, 0xae, 0x04, 0xf0, 0x83, 0xc9, 0x24, 0x61, 0xcf, 0xf5, 0x48, 0x3a, 0x8c, 0xed, 0x98, + 0x04, 0xa5, 0x7c, 0xf0, 0x7d, 0x50, 0xf2, 0x08, 0x63, 0xd8, 0x21, 0x6a, 0xca, 0xae, 0x2b, 0x78, + 0x69, 0x3b, 0x32, 0xa3, 0x78, 0x1f, 0xfe, 0x00, 0x8a, 0x3e, 0xb5, 0x09, 0xab, 0x17, 0xa5, 0x76, + 0xb4, 0x5f, 0x97, 0x08, 0x1b, 0xe2, 0xc4, 0x6c, 0xdd, 0xe7, 0x61, 0x46, 0x4c, 0xa4, 0x0d, 0x45, + 0x01, 0x1b, 0x4f, 0x00, 0x48, 0x31, 0xf0, 0x06, 0xc8, 0x1f, 0x93, 0x41, 0x54, 0x3f, 0x24, 0x3e, + 0xe1, 0x43, 0x50, 0xec, 0xe3, 0x6e, 0x8f, 0xa8, 0xea, 0xac, 0x4f, 0x35, 0xa2, 0x36, 0x51, 0xbf, + 0x05, 0x11, 0xe7, 0xa7, 0xb9, 0x15, 0x4d, 0x5f, 0x04, 0xf2, 0xf7, 0x35, 0x11, 0x25, 0x6d, 0x9c, + 0x28, 0xe9, 0xff, 0x68, 0x40, 0xfe, 0x4e, 0xc2, 0xf7, 0x40, 0xbe, 0x17, 0x76, 0x15, 0xb2, 0xaa, + 0x90, 0xf9, 0x7d, 0xb4, 0x85, 0x84, 0x1d, 0x3e, 0x50, 0x22, 0x10, 0x09, 0xc6, 0xea, 0xb9, 0x87, + 0xc6, 0xdd, 0x97, 0x78, 0x68, 0x88, 0x68, 0x19, 0xed, 0xb8, 0x05, 0xca, 0x56, 0xd7, 0x25, 0x3e, + 0xdf, 0xb4, 0xcf, 0xab, 0xe2, 0xaa, 0xb2, 0xa3, 0x04, 0x21, 0xc5, 0xab, 0xdb, 0x63, 0x9c, 0x84, + 0x9b, 0xb6, 0x1a, 0x80, 0x54, 0xbc, 0xe2, 0x0d, 0x94, 0x62, 0xf4, 0xdf, 0xf3, 0x51, 0x2f, 0xd4, + 0x34, 0x37, 0x40, 0xce, 0xb5, 0xd5, 0x21, 0x81, 0x72, 0xcc, 0x6d, 0xae, 0xa1, 0x9c, 0x6b, 0x27, + 0x1a, 0x9f, 0x1f, 0xab, 0xf1, 0x1f, 0x81, 0xaa, 0xed, 0xb2, 0xa0, 0x8b, 0x07, 0xc2, 0x28, 0xd5, + 0xaa, 0xd2, 0x7a, 0x53, 0x01, 0xab, 0x6b, 0xe9, 0x16, 0xca, 0xe2, 0xd2, 0x2b, 0x34, 0x3b, 0xe9, + 0x15, 0x3a, 0xc8, 0x5e, 0xa1, 0x92, 0x1c, 0x12, 0x73, 0xb2, 0x2b, 0xb4, 0xed, 0x5a, 0x21, 0x7d, + 0xb9, 0x7b, 0x54, 0xbe, 0xe2, 0x1e, 0x59, 0x00, 0xf4, 0x02, 0x1b, 0x73, 0x22, 0x68, 0xeb, 0x95, + 0x57, 0xcb, 0x26, 0x79, 0x30, 0xed, 0x27, 0x54, 0x28, 0x43, 0xab, 0xff, 0x96, 0x03, 0x37, 0x2f, + 0x93, 0x5b, 0xf8, 0x93, 0x06, 0xca, 0x6a, 0xea, 0x59, 0x5d, 0x93, 0x37, 0x79, 0x7f, 0xfa, 0x9b, + 0x7c, 0x49, 0xa8, 0x74, 0xee, 0x14, 0x86, 0xa1, 0x24, 0x30, 0x7c, 0x02, 0x4a, 0xd1, 0x7f, 0x98, + 0xf8, 0x25, 0xb2, 0x37, 0x45, 0x0e, 0x6d, 0xc9, 0x74, 0x59, 0x0a, 0x49, 0x13, 0x22, 0x08, 0x43, + 0x71, 0x54, 0xfd, 0x0b, 0xf0, 0xce, 0x58, 0xb7, 0xab, 0x5f, 0x27, 0x2d, 0xe3, 0xe4, 0xac, 0x39, + 0xf3, 0xf4, 0xac, 0x39, 0xf3, 0xec, 0xac, 0x39, 0xf3, 0xe3, 0xb0, 0xa9, 0x9d, 0x0c, 0x9b, 0xda, + 0xd3, 0x61, 0x53, 0x7b, 0x36, 0x6c, 0x6a, 0xff, 0x0e, 0x9b, 0xda, 0xaf, 0xff, 0x35, 0x67, 0xbe, + 0x2d, 0xc7, 0x29, 0xbe, 0x08, 0x00, 0x00, 0xff, 0xff, 0x16, 0xab, 0x38, 0xfb, 0x61, 0x0e, 0x00, + 0x00, } diff --git a/pkg/apis/gateway/v1alpha1/generated.proto b/pkg/apis/gateway/v1alpha1/generated.proto index 4dd14d153c..59944b2c67 100644 --- a/pkg/apis/gateway/v1alpha1/generated.proto +++ b/pkg/apis/gateway/v1alpha1/generated.proto @@ -30,7 +30,7 @@ import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; option go_package = "v1alpha1"; // Dispatch protocol contains configuration necessary to dispatch an event to sensor over different communication protocols -message DispatchProtocol { +message EventProtocol { optional string type = 1; optional Http http = 2; @@ -102,7 +102,7 @@ message GatewaySpec { optional string processorPort = 7; // EventProtocol is the underlying protocol used to send events from gateway to watchers(components interested in listening to event from this gateway) - optional DispatchProtocol dispatchProtocol = 8; + optional EventProtocol eventProtocol = 8; } // GatewayStatus contains information about the status of a gateway. diff --git a/pkg/apis/gateway/v1alpha1/openapi_generated.go b/pkg/apis/gateway/v1alpha1/openapi_generated.go index e04dfbf611..440f202968 100644 --- a/pkg/apis/gateway/v1alpha1/openapi_generated.go +++ b/pkg/apis/gateway/v1alpha1/openapi_generated.go @@ -28,7 +28,7 @@ import ( func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenAPIDefinition { return map[string]common.OpenAPIDefinition{ - "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.DispatchProtocol": schema_pkg_apis_gateway_v1alpha1_DispatchProtocol(ref), + "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.EventProtocol": schema_pkg_apis_gateway_v1alpha1_EventProtocol(ref), "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.Gateway": schema_pkg_apis_gateway_v1alpha1_Gateway(ref), "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.GatewayList": schema_pkg_apis_gateway_v1alpha1_GatewayList(ref), "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.GatewayNotificationWatcher": schema_pkg_apis_gateway_v1alpha1_GatewayNotificationWatcher(ref), @@ -42,7 +42,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA } } -func schema_pkg_apis_gateway_v1alpha1_DispatchProtocol(ref common.ReferenceCallback) common.OpenAPIDefinition { +func schema_pkg_apis_gateway_v1alpha1_EventProtocol(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ SchemaProps: spec.SchemaProps{ @@ -217,18 +217,18 @@ func schema_pkg_apis_gateway_v1alpha1_GatewaySpec(ref common.ReferenceCallback) Format: "", }, }, - "dispatchProtocol": { + "eventProtocol": { SchemaProps: spec.SchemaProps{ Description: "EventProtocol is the underlying protocol used to send events from gateway to watchers(components interested in listening to event from this gateway)", - Ref: ref("github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.DispatchProtocol"), + Ref: ref("github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.EventProtocol"), }, }, }, - Required: []string{"deploySpec", "type", "eventVersion", "processorPort", "dispatchProtocol"}, + Required: []string{"deploySpec", "type", "eventVersion", "processorPort", "eventProtocol"}, }, }, Dependencies: []string{ - "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.DispatchProtocol", "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.NotificationWatchers", "k8s.io/api/core/v1.Pod", "k8s.io/api/core/v1.Service"}, + "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.EventProtocol", "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.NotificationWatchers", "k8s.io/api/core/v1.Pod", "k8s.io/api/core/v1.Service"}, } } diff --git a/pkg/apis/gateway/v1alpha1/types.go b/pkg/apis/gateway/v1alpha1/types.go index e15c7dfea3..0150de2495 100644 --- a/pkg/apis/gateway/v1alpha1/types.go +++ b/pkg/apis/gateway/v1alpha1/types.go @@ -17,7 +17,7 @@ limitations under the License. package v1alpha1 import ( - "github.com/argoproj/argo-events/common" + "github.com/argoproj/argo-events/pkg/common" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -87,7 +87,7 @@ type GatewaySpec struct { ProcessorPort string `json:"processorPort" protobuf:"bytes,7,opt,name=processorPort"` // EventProtocol is the underlying protocol used to send events from gateway to watchers(components interested in listening to event from this gateway) - EventProtocol DispatchProtocol `json:"dispatchProtocol" protobuf:"bytes,8,opt,name=dispatchProtocol"` + EventProtocol EventProtocol `json:"eventProtocol" protobuf:"bytes,8,opt,name=eventProtocol"` } // GatewayStatus contains information about the status of a gateway. @@ -163,7 +163,7 @@ type SensorNotificationWatcher struct { } // Dispatch protocol contains configuration necessary to dispatch an event to sensor over different communication protocols -type DispatchProtocol struct { +type EventProtocol struct { Type common.EventProtocolType `json:"type" protobuf:"bytes,1,opt,name=type"` Http Http `json:"http" protobuf:"bytes,2,opt,name=http"` diff --git a/pkg/apis/gateway/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/gateway/v1alpha1/zz_generated.deepcopy.go index 3c007a2d93..74e6a1759f 100644 --- a/pkg/apis/gateway/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/gateway/v1alpha1/zz_generated.deepcopy.go @@ -25,19 +25,19 @@ import ( ) // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *DispatchProtocol) DeepCopyInto(out *DispatchProtocol) { +func (in *EventProtocol) DeepCopyInto(out *EventProtocol) { *out = *in out.Http = in.Http out.Nats = in.Nats return } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DispatchProtocol. -func (in *DispatchProtocol) DeepCopy() *DispatchProtocol { +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EventProtocol. +func (in *EventProtocol) DeepCopy() *EventProtocol { if in == nil { return nil } - out := new(DispatchProtocol) + out := new(EventProtocol) in.DeepCopyInto(out) return out } diff --git a/pkg/apis/sensor/v1alpha1/generated.pb.go b/pkg/apis/sensor/v1alpha1/generated.pb.go index 69cb1f73cd..dcba756144 100644 --- a/pkg/apis/sensor/v1alpha1/generated.pb.go +++ b/pkg/apis/sensor/v1alpha1/generated.pb.go @@ -23,7 +23,7 @@ import math "math" import v11 "k8s.io/api/core/v1" -import github_com_argoproj_argo_events_common "github.com/argoproj/argo-events/common" +import github_com_argoproj_argo_events_pkg_common "github.com/argoproj/argo-events/pkg/common" import github_com_minio_minio_go "github.com/minio/minio-go" import github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys" @@ -47,7 +47,7 @@ const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package func (m *ArtifactLocation) Reset() { *m = ArtifactLocation{} } func (*ArtifactLocation) ProtoMessage() {} func (*ArtifactLocation) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{0} + return fileDescriptor_generated_9dc287890dc55c87, []int{0} } func (m *ArtifactLocation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -75,7 +75,7 @@ var xxx_messageInfo_ArtifactLocation proto.InternalMessageInfo func (m *ConfigmapArtifact) Reset() { *m = ConfigmapArtifact{} } func (*ConfigmapArtifact) ProtoMessage() {} func (*ConfigmapArtifact) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{1} + return fileDescriptor_generated_9dc287890dc55c87, []int{1} } func (m *ConfigmapArtifact) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -103,7 +103,7 @@ var xxx_messageInfo_ConfigmapArtifact proto.InternalMessageInfo func (m *Data) Reset() { *m = Data{} } func (*Data) ProtoMessage() {} func (*Data) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{2} + return fileDescriptor_generated_9dc287890dc55c87, []int{2} } func (m *Data) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -131,7 +131,7 @@ var xxx_messageInfo_Data proto.InternalMessageInfo func (m *DataFilter) Reset() { *m = DataFilter{} } func (*DataFilter) ProtoMessage() {} func (*DataFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{3} + return fileDescriptor_generated_9dc287890dc55c87, []int{3} } func (m *DataFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -159,7 +159,7 @@ var xxx_messageInfo_DataFilter proto.InternalMessageInfo func (m *Event) Reset() { *m = Event{} } func (*Event) ProtoMessage() {} func (*Event) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{4} + return fileDescriptor_generated_9dc287890dc55c87, []int{4} } func (m *Event) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -187,7 +187,7 @@ var xxx_messageInfo_Event proto.InternalMessageInfo func (m *EventContext) Reset() { *m = EventContext{} } func (*EventContext) ProtoMessage() {} func (*EventContext) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{5} + return fileDescriptor_generated_9dc287890dc55c87, []int{5} } func (m *EventContext) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -215,7 +215,7 @@ var xxx_messageInfo_EventContext proto.InternalMessageInfo func (m *EventDependency) Reset() { *m = EventDependency{} } func (*EventDependency) ProtoMessage() {} func (*EventDependency) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{6} + return fileDescriptor_generated_9dc287890dc55c87, []int{6} } func (m *EventDependency) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -243,7 +243,7 @@ var xxx_messageInfo_EventDependency proto.InternalMessageInfo func (m *EventDependencyFilter) Reset() { *m = EventDependencyFilter{} } func (*EventDependencyFilter) ProtoMessage() {} func (*EventDependencyFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{7} + return fileDescriptor_generated_9dc287890dc55c87, []int{7} } func (m *EventDependencyFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -271,7 +271,7 @@ var xxx_messageInfo_EventDependencyFilter proto.InternalMessageInfo func (m *EventProtocol) Reset() { *m = EventProtocol{} } func (*EventProtocol) ProtoMessage() {} func (*EventProtocol) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{8} + return fileDescriptor_generated_9dc287890dc55c87, []int{8} } func (m *EventProtocol) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -299,7 +299,7 @@ var xxx_messageInfo_EventProtocol proto.InternalMessageInfo func (m *FileArtifact) Reset() { *m = FileArtifact{} } func (*FileArtifact) ProtoMessage() {} func (*FileArtifact) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{9} + return fileDescriptor_generated_9dc287890dc55c87, []int{9} } func (m *FileArtifact) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -327,7 +327,7 @@ var xxx_messageInfo_FileArtifact proto.InternalMessageInfo func (m *GroupVersionKind) Reset() { *m = GroupVersionKind{} } func (*GroupVersionKind) ProtoMessage() {} func (*GroupVersionKind) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{10} + return fileDescriptor_generated_9dc287890dc55c87, []int{10} } func (m *GroupVersionKind) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -355,7 +355,7 @@ var xxx_messageInfo_GroupVersionKind proto.InternalMessageInfo func (m *Http) Reset() { *m = Http{} } func (*Http) ProtoMessage() {} func (*Http) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{11} + return fileDescriptor_generated_9dc287890dc55c87, []int{11} } func (m *Http) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -383,7 +383,7 @@ var xxx_messageInfo_Http proto.InternalMessageInfo func (m *Nats) Reset() { *m = Nats{} } func (*Nats) ProtoMessage() {} func (*Nats) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{12} + return fileDescriptor_generated_9dc287890dc55c87, []int{12} } func (m *Nats) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -411,7 +411,7 @@ var xxx_messageInfo_Nats proto.InternalMessageInfo func (m *NodeStatus) Reset() { *m = NodeStatus{} } func (*NodeStatus) ProtoMessage() {} func (*NodeStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{13} + return fileDescriptor_generated_9dc287890dc55c87, []int{13} } func (m *NodeStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -439,7 +439,7 @@ var xxx_messageInfo_NodeStatus proto.InternalMessageInfo func (m *ResourceObject) Reset() { *m = ResourceObject{} } func (*ResourceObject) ProtoMessage() {} func (*ResourceObject) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{14} + return fileDescriptor_generated_9dc287890dc55c87, []int{14} } func (m *ResourceObject) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -467,7 +467,7 @@ var xxx_messageInfo_ResourceObject proto.InternalMessageInfo func (m *ResourceParameter) Reset() { *m = ResourceParameter{} } func (*ResourceParameter) ProtoMessage() {} func (*ResourceParameter) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{15} + return fileDescriptor_generated_9dc287890dc55c87, []int{15} } func (m *ResourceParameter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -495,7 +495,7 @@ var xxx_messageInfo_ResourceParameter proto.InternalMessageInfo func (m *ResourceParameterSource) Reset() { *m = ResourceParameterSource{} } func (*ResourceParameterSource) ProtoMessage() {} func (*ResourceParameterSource) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{16} + return fileDescriptor_generated_9dc287890dc55c87, []int{16} } func (m *ResourceParameterSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -523,7 +523,7 @@ var xxx_messageInfo_ResourceParameterSource proto.InternalMessageInfo func (m *RetryStrategy) Reset() { *m = RetryStrategy{} } func (*RetryStrategy) ProtoMessage() {} func (*RetryStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{17} + return fileDescriptor_generated_9dc287890dc55c87, []int{17} } func (m *RetryStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -551,7 +551,7 @@ var xxx_messageInfo_RetryStrategy proto.InternalMessageInfo func (m *S3Artifact) Reset() { *m = S3Artifact{} } func (*S3Artifact) ProtoMessage() {} func (*S3Artifact) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{18} + return fileDescriptor_generated_9dc287890dc55c87, []int{18} } func (m *S3Artifact) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -579,7 +579,7 @@ var xxx_messageInfo_S3Artifact proto.InternalMessageInfo func (m *S3Bucket) Reset() { *m = S3Bucket{} } func (*S3Bucket) ProtoMessage() {} func (*S3Bucket) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{19} + return fileDescriptor_generated_9dc287890dc55c87, []int{19} } func (m *S3Bucket) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -607,7 +607,7 @@ var xxx_messageInfo_S3Bucket proto.InternalMessageInfo func (m *S3Filter) Reset() { *m = S3Filter{} } func (*S3Filter) ProtoMessage() {} func (*S3Filter) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{20} + return fileDescriptor_generated_9dc287890dc55c87, []int{20} } func (m *S3Filter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -635,7 +635,7 @@ var xxx_messageInfo_S3Filter proto.InternalMessageInfo func (m *Sensor) Reset() { *m = Sensor{} } func (*Sensor) ProtoMessage() {} func (*Sensor) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{21} + return fileDescriptor_generated_9dc287890dc55c87, []int{21} } func (m *Sensor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -663,7 +663,7 @@ var xxx_messageInfo_Sensor proto.InternalMessageInfo func (m *SensorList) Reset() { *m = SensorList{} } func (*SensorList) ProtoMessage() {} func (*SensorList) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{22} + return fileDescriptor_generated_9dc287890dc55c87, []int{22} } func (m *SensorList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -691,7 +691,7 @@ var xxx_messageInfo_SensorList proto.InternalMessageInfo func (m *SensorSpec) Reset() { *m = SensorSpec{} } func (*SensorSpec) ProtoMessage() {} func (*SensorSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{23} + return fileDescriptor_generated_9dc287890dc55c87, []int{23} } func (m *SensorSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -719,7 +719,7 @@ var xxx_messageInfo_SensorSpec proto.InternalMessageInfo func (m *SensorStatus) Reset() { *m = SensorStatus{} } func (*SensorStatus) ProtoMessage() {} func (*SensorStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{24} + return fileDescriptor_generated_9dc287890dc55c87, []int{24} } func (m *SensorStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -747,7 +747,7 @@ var xxx_messageInfo_SensorStatus proto.InternalMessageInfo func (m *TimeFilter) Reset() { *m = TimeFilter{} } func (*TimeFilter) ProtoMessage() {} func (*TimeFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{25} + return fileDescriptor_generated_9dc287890dc55c87, []int{25} } func (m *TimeFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -775,7 +775,7 @@ var xxx_messageInfo_TimeFilter proto.InternalMessageInfo func (m *Trigger) Reset() { *m = Trigger{} } func (*Trigger) ProtoMessage() {} func (*Trigger) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{26} + return fileDescriptor_generated_9dc287890dc55c87, []int{26} } func (m *Trigger) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -803,7 +803,7 @@ var xxx_messageInfo_Trigger proto.InternalMessageInfo func (m *URI) Reset() { *m = URI{} } func (*URI) ProtoMessage() {} func (*URI) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{27} + return fileDescriptor_generated_9dc287890dc55c87, []int{27} } func (m *URI) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -831,7 +831,7 @@ var xxx_messageInfo_URI proto.InternalMessageInfo func (m *URLArtifact) Reset() { *m = URLArtifact{} } func (*URLArtifact) ProtoMessage() {} func (*URLArtifact) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_ec9cfdab9b6e0e15, []int{28} + return fileDescriptor_generated_9dc287890dc55c87, []int{28} } func (m *URLArtifact) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4618,7 +4618,7 @@ func (m *EventProtocol) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Type = github_com_argoproj_argo_events_common.EventProtocolType(dAtA[iNdEx:postIndex]) + m.Type = github_com_argoproj_argo_events_pkg_common.EventProtocolType(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { @@ -5286,7 +5286,7 @@ func (m *Nats) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Type = github_com_argoproj_argo_events_common.NatsType(dAtA[iNdEx:postIndex]) + m.Type = github_com_argoproj_argo_events_pkg_common.NatsType(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -8217,172 +8217,172 @@ var ( ) func init() { - proto.RegisterFile("github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1/generated.proto", fileDescriptor_generated_ec9cfdab9b6e0e15) + proto.RegisterFile("github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1/generated.proto", fileDescriptor_generated_9dc287890dc55c87) } -var fileDescriptor_generated_ec9cfdab9b6e0e15 = []byte{ - // 2600 bytes of a gzipped FileDescriptorProto +var fileDescriptor_generated_9dc287890dc55c87 = []byte{ + // 2606 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x59, 0xcd, 0x6f, 0x1b, 0xc7, - 0x15, 0xf7, 0xf2, 0x4b, 0xe4, 0x93, 0x6c, 0xc9, 0xe3, 0x18, 0x21, 0x14, 0x44, 0x32, 0x36, 0x68, - 0xe0, 0x16, 0x31, 0x69, 0x5b, 0x4d, 0xe1, 0x16, 0x48, 0x13, 0x51, 0x94, 0x63, 0x59, 0xb2, 0x2c, - 0x0f, 0x63, 0x17, 0x70, 0x03, 0xd4, 0xab, 0xdd, 0x21, 0xb5, 0xd6, 0x72, 0x77, 0x3d, 0x33, 0x54, - 0xcd, 0xa2, 0x68, 0x93, 0x7e, 0x5c, 0x7a, 0x28, 0x72, 0xef, 0xb1, 0xff, 0x40, 0x7b, 0x29, 0x7a, - 0xee, 0xc9, 0x97, 0x02, 0x29, 0x0a, 0x14, 0xe9, 0x45, 0xa8, 0x59, 0xa0, 0x28, 0xfa, 0x27, 0xe4, - 0x54, 0xcc, 0xc7, 0xce, 0x2e, 0x97, 0x12, 0x2c, 0x8b, 0xba, 0xd8, 0xdc, 0xf7, 0xde, 0xfc, 0xde, - 0x9b, 0x37, 0x6f, 0xde, 0xc7, 0x08, 0xee, 0xf4, 0x7c, 0xbe, 0x37, 0xd8, 0x6d, 0xb8, 0x51, 0xbf, - 0xe9, 0xd0, 0x5e, 0x14, 0xd3, 0xe8, 0xa9, 0xfc, 0x71, 0x8d, 0x1c, 0x90, 0x90, 0xb3, 0x66, 0xbc, - 0xdf, 0x6b, 0x3a, 0xb1, 0xcf, 0x9a, 0x8c, 0x84, 0x2c, 0xa2, 0xcd, 0x83, 0x1b, 0x4e, 0x10, 0xef, - 0x39, 0x37, 0x9a, 0x3d, 0x12, 0x12, 0xea, 0x70, 0xe2, 0x35, 0x62, 0x1a, 0xf1, 0x08, 0xdd, 0x4a, - 0x91, 0x1a, 0x09, 0x92, 0xfc, 0xf1, 0x23, 0x85, 0xd4, 0x88, 0xf7, 0x7b, 0x0d, 0x81, 0xd4, 0x50, - 0x48, 0x8d, 0x04, 0x69, 0xf1, 0x5a, 0xc6, 0x86, 0x5e, 0xd4, 0x8b, 0x9a, 0x12, 0x70, 0x77, 0xd0, - 0x95, 0x5f, 0xf2, 0x43, 0xfe, 0x52, 0x8a, 0x16, 0xed, 0xfd, 0x5b, 0xac, 0xe1, 0x47, 0xc2, 0xaa, - 0xa6, 0x1b, 0x51, 0xd2, 0x3c, 0x98, 0x30, 0x66, 0xf1, 0xdb, 0xa9, 0x4c, 0xdf, 0x71, 0xf7, 0xfc, - 0x90, 0xd0, 0x61, 0xba, 0x95, 0x3e, 0xe1, 0xce, 0x51, 0xab, 0x9a, 0xc7, 0xad, 0xa2, 0x83, 0x90, - 0xfb, 0x7d, 0x32, 0xb1, 0xe0, 0x3b, 0xaf, 0x5a, 0xc0, 0xdc, 0x3d, 0xd2, 0x77, 0x26, 0xd6, 0xad, - 0x1c, 0xb7, 0x6e, 0xc0, 0xfd, 0xa0, 0xe9, 0x87, 0x9c, 0x71, 0x9a, 0x5f, 0x64, 0xff, 0xa3, 0x08, - 0x0b, 0xab, 0x94, 0xfb, 0x5d, 0xc7, 0xe5, 0x5b, 0x91, 0xeb, 0x70, 0x3f, 0x0a, 0xd1, 0xa7, 0x50, - 0x60, 0x2b, 0x75, 0xeb, 0x8a, 0x75, 0x75, 0xf6, 0x66, 0xbb, 0x71, 0xda, 0x23, 0x68, 0x74, 0x56, - 0x12, 0xe4, 0x56, 0x65, 0x74, 0xb8, 0x5c, 0xe8, 0xac, 0xe0, 0x02, 0x5b, 0x41, 0x36, 0x54, 0xfc, - 0x30, 0xf0, 0x43, 0x52, 0x2f, 0x5c, 0xb1, 0xae, 0xd6, 0x5a, 0x30, 0x3a, 0x5c, 0xae, 0x6c, 0x48, - 0x0a, 0xd6, 0x1c, 0xe4, 0x41, 0xa9, 0xeb, 0x07, 0xa4, 0x5e, 0x94, 0x36, 0xdc, 0x3e, 0xbd, 0x0d, - 0xb7, 0xfd, 0x80, 0x18, 0x2b, 0xaa, 0xa3, 0xc3, 0xe5, 0x92, 0xa0, 0x60, 0x89, 0x8e, 0x9e, 0x40, - 0x71, 0x40, 0x83, 0x7a, 0x49, 0x2a, 0x59, 0x3f, 0xbd, 0x92, 0x87, 0x78, 0xcb, 0xe8, 0x98, 0x19, - 0x1d, 0x2e, 0x17, 0x1f, 0xe2, 0x2d, 0x2c, 0xa0, 0xd1, 0x73, 0xa8, 0xb9, 0x51, 0xd8, 0xf5, 0x7b, - 0x7d, 0x27, 0xae, 0x97, 0xa5, 0x9e, 0xcd, 0xd3, 0xeb, 0x59, 0x4b, 0xa0, 0x8c, 0xb6, 0xf3, 0xa3, - 0xc3, 0xe5, 0x9a, 0x21, 0xe3, 0x54, 0x99, 0xfd, 0x6b, 0x0b, 0x2e, 0x4e, 0xc8, 0xa3, 0x2b, 0x50, - 0x0a, 0x9d, 0x3e, 0x91, 0x67, 0x5b, 0x6b, 0xcd, 0xbd, 0x38, 0x5c, 0x3e, 0x27, 0x7c, 0xb2, 0xed, - 0xf4, 0x09, 0x96, 0x1c, 0xd4, 0x84, 0x9a, 0xf8, 0x9f, 0xc5, 0x8e, 0x9b, 0x1c, 0xd0, 0x45, 0x2d, - 0x56, 0xdb, 0x4e, 0x18, 0x38, 0x95, 0x41, 0x6f, 0x43, 0x71, 0x9f, 0x0c, 0xe5, 0x49, 0xd5, 0x5a, - 0xb3, 0x5a, 0xb4, 0xb8, 0x49, 0x86, 0x58, 0xd0, 0x6d, 0x06, 0xa5, 0xb6, 0xc3, 0x1d, 0xb4, 0x0f, - 0x33, 0x5d, 0x3f, 0xe0, 0x84, 0xb2, 0xba, 0x75, 0xa5, 0x38, 0x5d, 0x60, 0x09, 0xc0, 0xdb, 0x12, - 0xac, 0x35, 0x3b, 0x3a, 0x5c, 0x9e, 0x51, 0xbf, 0x19, 0x4e, 0x34, 0xd8, 0x9f, 0x5b, 0x00, 0xa9, - 0x90, 0xd8, 0x75, 0xec, 0xf0, 0xbd, 0xfc, 0xae, 0x77, 0x1c, 0xbe, 0x87, 0x25, 0x07, 0xbd, 0x07, - 0x25, 0x3e, 0x8c, 0x93, 0x0d, 0xd7, 0x13, 0x89, 0x4f, 0x86, 0x31, 0xf9, 0xfa, 0x70, 0xb9, 0x7a, - 0xb7, 0x73, 0x7f, 0x5b, 0xfc, 0xc6, 0x52, 0x0a, 0xbd, 0x03, 0xe5, 0x03, 0x27, 0x18, 0x10, 0xbd, - 0xe9, 0xf3, 0x5a, 0xbc, 0xfc, 0x48, 0x10, 0xb1, 0xe2, 0xd9, 0xbf, 0xb3, 0xa0, 0xbc, 0x2e, 0x36, - 0x82, 0x9e, 0xc1, 0x8c, 0x1b, 0x85, 0x9c, 0x3c, 0xe7, 0xfa, 0x4e, 0x4d, 0x11, 0xcf, 0x12, 0x71, - 0x4d, 0xa1, 0xb5, 0xe6, 0xb5, 0xe2, 0x19, 0x4d, 0xc0, 0x89, 0x1e, 0xb4, 0x0c, 0x25, 0xcf, 0xe1, - 0x8e, 0xdc, 0xcf, 0x9c, 0x72, 0xd2, 0x8e, 0x33, 0x0c, 0x22, 0xc7, 0xc3, 0x92, 0x61, 0xff, 0xa1, - 0x02, 0x73, 0x59, 0x2c, 0x71, 0xee, 0x52, 0xb7, 0xd8, 0xa6, 0x76, 0x94, 0x39, 0xf7, 0xf5, 0x84, - 0x81, 0x53, 0x19, 0xd4, 0x86, 0x05, 0xf3, 0xf1, 0x88, 0x50, 0xe6, 0x47, 0x61, 0xce, 0x7d, 0x0b, - 0xeb, 0x39, 0x3e, 0x9e, 0x58, 0x81, 0xee, 0x02, 0x72, 0x83, 0x68, 0xe0, 0x49, 0x51, 0x96, 0xe0, - 0x28, 0xbf, 0x2e, 0x6a, 0x1c, 0xb4, 0x36, 0x21, 0x81, 0x8f, 0x58, 0x85, 0x1c, 0xa8, 0xb0, 0x68, - 0x40, 0x5d, 0xa2, 0x6f, 0xf4, 0x07, 0xd3, 0xdc, 0xe8, 0x0d, 0x95, 0x97, 0x3a, 0x12, 0x10, 0x6b, - 0x60, 0xf4, 0x4d, 0x98, 0x91, 0x4b, 0x37, 0xda, 0xf2, 0x36, 0xd7, 0xd2, 0x23, 0x58, 0x57, 0x64, - 0x9c, 0xf0, 0xd1, 0x93, 0xc4, 0xa1, 0x7e, 0x9f, 0xd4, 0x2b, 0xd2, 0xa0, 0x66, 0x43, 0xa5, 0xe8, - 0x46, 0x36, 0x45, 0xa7, 0x46, 0x88, 0x0a, 0xd2, 0x38, 0xb8, 0xd1, 0xb8, 0xe7, 0xbb, 0x34, 0x12, - 0xcb, 0xf2, 0x27, 0xe0, 0xf7, 0xcd, 0x09, 0xf8, 0x7d, 0x82, 0x9e, 0x42, 0x4d, 0x95, 0x82, 0x87, - 0x78, 0xab, 0x3e, 0x73, 0x16, 0x5b, 0x96, 0xe9, 0xa4, 0x93, 0x60, 0xe2, 0x14, 0x1e, 0xbd, 0x0f, - 0xb3, 0x32, 0xb6, 0x74, 0x80, 0x54, 0xe5, 0xe6, 0x2f, 0x69, 0xf3, 0x66, 0xd7, 0x52, 0x16, 0xce, - 0xca, 0xa1, 0xdf, 0x58, 0x00, 0xe4, 0x39, 0x27, 0xa1, 0x38, 0x20, 0x56, 0xaf, 0xc9, 0x9b, 0xff, - 0xe8, 0x6c, 0xc2, 0xbf, 0xb1, 0x6e, 0x80, 0xd7, 0x43, 0x4e, 0x87, 0x2d, 0xa4, 0xcd, 0x81, 0x94, - 0x81, 0x33, 0xda, 0x17, 0x3f, 0x80, 0xf9, 0xdc, 0x12, 0xb4, 0xa0, 0x92, 0x97, 0x8c, 0x77, 0x99, - 0xaf, 0xd0, 0x1b, 0xc9, 0xdd, 0x96, 0xb1, 0xac, 0x2f, 0xf3, 0xf7, 0x0a, 0xb7, 0x2c, 0xfb, 0xb7, - 0x05, 0x98, 0x97, 0xfa, 0xdb, 0x24, 0x26, 0xa1, 0x47, 0x42, 0x77, 0x78, 0x82, 0x7c, 0xfa, 0x1e, - 0x54, 0x3d, 0xe2, 0x78, 0xa6, 0xde, 0x15, 0x5b, 0x0b, 0x5a, 0xaa, 0xda, 0xd6, 0x74, 0x6c, 0x24, - 0xd0, 0x4f, 0xd2, 0x2c, 0xa9, 0x4a, 0xdf, 0xfd, 0x29, 0x7d, 0x95, 0xda, 0xaa, 0x13, 0xa6, 0x09, - 0xd8, 0x7c, 0xd2, 0x14, 0x19, 0xc0, 0x8d, 0xc2, 0x90, 0xb8, 0x9c, 0x78, 0xf2, 0x06, 0x55, 0xd3, - 0xf8, 0x5b, 0x4b, 0x18, 0x38, 0x95, 0xb1, 0xff, 0x57, 0x80, 0xcb, 0x47, 0x2a, 0x39, 0x81, 0x5b, - 0x76, 0xa1, 0x24, 0x7a, 0x19, 0xe9, 0x92, 0xa9, 0x6a, 0x81, 0xb8, 0x09, 0x7a, 0x6b, 0xb2, 0xbc, - 0xcb, 0x4b, 0x22, 0xb1, 0x51, 0x3f, 0xcd, 0xbb, 0xc5, 0x33, 0xcd, 0xbb, 0xb3, 0x47, 0xe6, 0xdc, - 0x4f, 0x75, 0xce, 0x55, 0xc9, 0xe7, 0xfb, 0xd3, 0x95, 0x37, 0xb5, 0x19, 0xf1, 0x4b, 0x27, 0xec, - 0x3f, 0x16, 0xe0, 0xbc, 0x34, 0x62, 0x47, 0xf4, 0x6d, 0x6e, 0x14, 0x08, 0x7d, 0x3c, 0x4d, 0xd6, - 0x77, 0x72, 0x35, 0xeb, 0xd6, 0xab, 0x7a, 0x70, 0x37, 0xea, 0xf7, 0xa3, 0xb0, 0x31, 0x86, 0x99, - 0xa9, 0x71, 0x4f, 0xa0, 0xb4, 0xc7, 0x79, 0xac, 0x0f, 0x68, 0x8a, 0xdd, 0xdc, 0xe1, 0x3c, 0x4e, - 0x43, 0x40, 0x7c, 0x61, 0x89, 0x2c, 0x34, 0x84, 0x0e, 0x4f, 0x02, 0x7d, 0x0a, 0x0d, 0xdb, 0x0e, - 0x67, 0xd9, 0x20, 0xe3, 0x0c, 0x4b, 0x64, 0xfb, 0x3a, 0xcc, 0x65, 0xfb, 0xbf, 0x57, 0xf7, 0x01, - 0xf6, 0xaf, 0x2c, 0x58, 0xf8, 0x98, 0x46, 0x83, 0x58, 0xd7, 0x94, 0x4d, 0x3f, 0xf4, 0x44, 0xb9, - 0xef, 0x09, 0x9a, 0x5e, 0x67, 0xca, 0xbd, 0x14, 0xc4, 0x8a, 0x27, 0x2a, 0xc3, 0xc1, 0x58, 0x15, - 0x34, 0x17, 0x2d, 0x29, 0x59, 0x09, 0x5f, 0x98, 0xb1, 0xef, 0x87, 0x9e, 0xae, 0x72, 0xc6, 0x0c, - 0xa1, 0x0b, 0x4b, 0x8e, 0x7d, 0x15, 0xa4, 0xa3, 0xa4, 0xc1, 0x11, 0xe5, 0x13, 0x06, 0x47, 0x94, - 0x63, 0xc9, 0xb1, 0xff, 0x5b, 0x02, 0xb9, 0x63, 0xd1, 0x86, 0x89, 0x5e, 0xd6, 0x1a, 0x6f, 0xc3, - 0x4c, 0x23, 0xda, 0x81, 0xcb, 0x8c, 0x3b, 0x94, 0xff, 0xc0, 0xe7, 0x7b, 0x5b, 0x0e, 0xe3, 0x98, - 0xb8, 0xc4, 0x3f, 0x20, 0x9e, 0x34, 0xb6, 0xda, 0x7a, 0x5b, 0x2f, 0xb8, 0xdc, 0x39, 0x4a, 0x08, - 0x1f, 0xbd, 0x16, 0xdd, 0x83, 0x4b, 0x1e, 0x09, 0xfc, 0x03, 0x42, 0x57, 0x83, 0x60, 0xf5, 0xc0, - 0xf1, 0x03, 0x67, 0x57, 0x37, 0xed, 0xd5, 0xd6, 0x5b, 0x1a, 0xf2, 0x52, 0x7b, 0x52, 0x04, 0x1f, - 0xb5, 0x0e, 0xad, 0xc2, 0xbc, 0xd4, 0xb3, 0xca, 0x3b, 0xe4, 0xd9, 0x80, 0x84, 0xba, 0x90, 0xd7, - 0x5a, 0x6f, 0x6a, 0xa8, 0xf9, 0xce, 0x38, 0x1b, 0xe7, 0xe5, 0x45, 0x99, 0xd2, 0x24, 0x59, 0x76, - 0xcb, 0xe3, 0x65, 0xaa, 0x93, 0xb2, 0x70, 0x56, 0x4e, 0xf4, 0x32, 0x99, 0xcf, 0x36, 0x09, 0xb8, - 0x23, 0x4b, 0x76, 0xa6, 0x97, 0xe9, 0xe4, 0xf8, 0x78, 0x62, 0x85, 0x08, 0x01, 0x6f, 0x40, 0xa5, - 0x0b, 0x66, 0xa4, 0x0b, 0x4c, 0x08, 0xb4, 0x15, 0x19, 0x27, 0x7c, 0x99, 0x6b, 0x83, 0x01, 0xe3, - 0x84, 0x6e, 0x78, 0xba, 0x98, 0xa6, 0xb9, 0x36, 0x61, 0xe0, 0x54, 0x46, 0x94, 0x11, 0x37, 0xf0, - 0x45, 0x67, 0xe1, 0xd5, 0x6b, 0x52, 0xde, 0x94, 0x91, 0x35, 0x4d, 0xc7, 0x46, 0x02, 0x75, 0x74, - 0x6a, 0x00, 0x29, 0xf9, 0x61, 0x2e, 0x35, 0x34, 0x4f, 0x98, 0x1a, 0x44, 0x5c, 0xa5, 0x19, 0xc1, - 0xfe, 0x73, 0x09, 0x60, 0x3b, 0xf2, 0x48, 0x87, 0x3b, 0x7c, 0xc0, 0xd0, 0x22, 0x14, 0x7c, 0x4f, - 0xc7, 0x1b, 0x68, 0x0d, 0x85, 0x8d, 0x36, 0x2e, 0xf8, 0x9e, 0xc9, 0xff, 0x85, 0x63, 0xf3, 0xff, - 0xfb, 0x30, 0xeb, 0xf9, 0x2c, 0x0e, 0x9c, 0xa1, 0x20, 0xea, 0xab, 0x60, 0x0e, 0xaa, 0x9d, 0xb2, - 0x70, 0x56, 0xce, 0xf4, 0xe9, 0xa5, 0xa3, 0xfb, 0x74, 0x61, 0x5e, 0x26, 0x87, 0x5d, 0x87, 0x72, - 0xbc, 0xe7, 0xb0, 0x24, 0x0e, 0x92, 0x7e, 0xb2, 0xbc, 0x23, 0x88, 0x5f, 0x8b, 0x81, 0x26, 0xf2, - 0x88, 0xfc, 0xc0, 0x4a, 0x50, 0x34, 0x6d, 0xf2, 0x58, 0x89, 0xb7, 0xca, 0xa7, 0x6e, 0xda, 0x3a, - 0x09, 0x12, 0x4e, 0x41, 0x51, 0x57, 0x34, 0x52, 0xfd, 0x38, 0x20, 0x4a, 0xc7, 0xcc, 0xe9, 0x74, - 0x64, 0x3a, 0x2f, 0x83, 0x85, 0xb3, 0xc0, 0x22, 0x18, 0xfb, 0x84, 0x31, 0xa7, 0x97, 0x34, 0x6b, - 0x26, 0x18, 0xef, 0x29, 0x32, 0x4e, 0xf8, 0xe8, 0x09, 0x94, 0xe5, 0xc1, 0xcb, 0xc0, 0x9a, 0xbd, - 0xf9, 0xe1, 0x94, 0x55, 0xb2, 0x55, 0x13, 0x3e, 0x96, 0x3f, 0xb1, 0x02, 0xb6, 0x7f, 0x51, 0x86, - 0x0b, 0x98, 0xa8, 0x1e, 0xfa, 0xfe, 0xee, 0x53, 0xe2, 0xf2, 0xf1, 0x39, 0xd3, 0x3a, 0xc1, 0x9c, - 0xf9, 0x53, 0xa8, 0x04, 0xce, 0x2e, 0x09, 0x44, 0xc1, 0x10, 0x5d, 0xe4, 0x27, 0xa7, 0x37, 0x73, - 0xdc, 0x94, 0xc6, 0x96, 0x84, 0x55, 0x3d, 0xe4, 0x05, 0x6d, 0x43, 0x45, 0x11, 0xb1, 0xd6, 0x89, - 0x7e, 0x0e, 0x10, 0x3b, 0xd4, 0xe9, 0x13, 0xd9, 0x9b, 0x95, 0xa4, 0x05, 0x9b, 0xd3, 0x5b, 0xb0, - 0x93, 0x60, 0xa6, 0xcd, 0xab, 0x21, 0x31, 0x9c, 0x51, 0x89, 0xbe, 0xb0, 0x60, 0xa1, 0x97, 0xab, - 0x4c, 0xfa, 0x45, 0xe1, 0xee, 0xe9, 0xed, 0xc8, 0xd7, 0xba, 0x34, 0xdf, 0xe5, 0x39, 0x78, 0x42, - 0x3b, 0xa2, 0x66, 0xde, 0xaa, 0x4c, 0x6b, 0x47, 0xfe, 0x09, 0x2a, 0x3d, 0x87, 0xf1, 0x01, 0x6c, - 0xf1, 0xbb, 0x30, 0x9b, 0x39, 0xae, 0xd7, 0xea, 0xdf, 0x7f, 0x6f, 0xc1, 0xc5, 0x09, 0xbf, 0xa3, - 0x00, 0x8a, 0x8c, 0xba, 0x7a, 0x30, 0x7f, 0x70, 0x86, 0x27, 0xaa, 0x0c, 0x57, 0xef, 0x41, 0x1d, - 0xea, 0x62, 0xa1, 0x46, 0x24, 0x46, 0x8f, 0x30, 0x9e, 0x4f, 0x8c, 0x6d, 0xc2, 0x38, 0x96, 0x1c, - 0xfb, 0x73, 0x0b, 0xde, 0x3c, 0x06, 0x4b, 0x34, 0x22, 0xea, 0xa2, 0xe6, 0x1a, 0x91, 0xec, 0x5d, - 0x33, 0x4d, 0x4e, 0xe1, 0xd8, 0xc7, 0x8e, 0xe5, 0xf1, 0xe7, 0x8b, 0xda, 0xc4, 0xd3, 0xc5, 0x3c, - 0x9c, 0xc7, 0x84, 0xd3, 0x61, 0x87, 0x53, 0x87, 0x93, 0xde, 0xd0, 0xfe, 0x67, 0x01, 0x20, 0x7d, - 0xcd, 0x4b, 0x9e, 0x7c, 0xac, 0xa3, 0x9f, 0x7c, 0xd0, 0xa3, 0xc4, 0x4c, 0x65, 0xc2, 0x47, 0x63, - 0x66, 0xe6, 0xea, 0x4f, 0xdf, 0x0f, 0xfd, 0x48, 0xfd, 0x7b, 0xad, 0x17, 0x35, 0xb6, 0x23, 0xee, - 0x77, 0x7d, 0x15, 0x03, 0xe9, 0xab, 0x83, 0xde, 0x59, 0x17, 0x2a, 0x6a, 0x56, 0xd1, 0x2d, 0x63, - 0x6b, 0x9a, 0xa7, 0x49, 0x3d, 0x33, 0xc8, 0x21, 0x5f, 0xfd, 0xc6, 0x1a, 0x1d, 0x05, 0x50, 0x65, - 0x2b, 0xad, 0x81, 0xbb, 0x4f, 0xb8, 0x6e, 0xe6, 0xa7, 0xd2, 0xa4, 0x90, 0x5a, 0x73, 0xa2, 0x56, - 0x27, 0x5f, 0xd8, 0x68, 0xb0, 0x0f, 0x0b, 0x60, 0xc8, 0xa2, 0xcc, 0x93, 0xd0, 0x8b, 0x23, 0xdf, - 0x1c, 0xb2, 0x29, 0xf3, 0xeb, 0x9a, 0x8e, 0x8d, 0x04, 0x7a, 0x17, 0x2a, 0xbb, 0xca, 0x4c, 0xe5, - 0x69, 0x73, 0x69, 0xb4, 0x12, 0xcd, 0x15, 0x72, 0x94, 0xf4, 0xd2, 0x87, 0x15, 0x23, 0x87, 0x25, - 0x15, 0x6b, 0xae, 0xd0, 0xee, 0x87, 0x8c, 0xb8, 0x03, 0x4a, 0xf4, 0x00, 0x68, 0xb4, 0x6f, 0x68, - 0x3a, 0x36, 0x12, 0x08, 0x43, 0xcd, 0x71, 0x5d, 0xc2, 0xd8, 0x26, 0x19, 0xea, 0x4c, 0xf4, 0x8d, - 0x4c, 0x1d, 0x6b, 0xb8, 0x11, 0x25, 0xa2, 0x6a, 0x75, 0x88, 0x4b, 0x09, 0xdf, 0x24, 0xc3, 0x0e, - 0x09, 0x88, 0xcb, 0x23, 0xaa, 0x9e, 0x19, 0x56, 0x93, 0xb5, 0x38, 0x85, 0x11, 0x98, 0x2c, 0x11, - 0xd7, 0x59, 0xe5, 0x75, 0x30, 0x0d, 0x19, 0xa7, 0x30, 0xf6, 0x63, 0xe1, 0x5f, 0x3d, 0x98, 0xbe, - 0x0b, 0x95, 0x98, 0x92, 0xae, 0xff, 0x5c, 0x7b, 0xd7, 0x78, 0x62, 0x47, 0x52, 0xb1, 0xe6, 0x0a, - 0x39, 0x36, 0xe8, 0x0a, 0xb9, 0x9c, 0x67, 0x3b, 0x92, 0x8a, 0x35, 0xd7, 0xfe, 0x4b, 0x01, 0x2a, - 0x1d, 0x79, 0xe2, 0xe8, 0x09, 0x54, 0x45, 0x9d, 0x96, 0x23, 0xa0, 0xca, 0x26, 0xd7, 0x4f, 0x56, - 0xd5, 0x55, 0x15, 0xba, 0x47, 0xb8, 0x93, 0x16, 0x81, 0x94, 0x86, 0x0d, 0x2a, 0xea, 0x42, 0x89, - 0xc5, 0xc4, 0x9d, 0x7e, 0x66, 0x56, 0x16, 0x77, 0x62, 0xe2, 0xa6, 0xf9, 0x41, 0x7c, 0x61, 0x89, - 0x8f, 0x42, 0xa8, 0x30, 0xd9, 0xe3, 0x4d, 0x3f, 0x36, 0x6b, 0x4d, 0x12, 0x2d, 0xe3, 0x44, 0xf9, - 0x8d, 0xb5, 0x16, 0xfb, 0x6f, 0x16, 0x80, 0x12, 0xdc, 0xf2, 0x99, 0x98, 0xa3, 0xf3, 0x8e, 0x6c, - 0x9c, 0xcc, 0x91, 0x62, 0xb5, 0x74, 0xa3, 0x89, 0xda, 0x84, 0x92, 0x71, 0x22, 0x81, 0xb2, 0xcf, - 0x49, 0x9f, 0xd5, 0x0b, 0xb2, 0x86, 0x7f, 0x34, 0xed, 0xde, 0xd2, 0x2c, 0xbc, 0x21, 0x60, 0xb1, - 0x42, 0xb7, 0xff, 0x5e, 0x4c, 0xf6, 0x24, 0x1c, 0x8b, 0x7e, 0x69, 0xc1, 0x9c, 0x97, 0xbc, 0x92, - 0xf8, 0x24, 0x79, 0x03, 0xdf, 0x38, 0xb3, 0xd7, 0x9d, 0xd6, 0x1b, 0xda, 0x8c, 0xb9, 0x76, 0x46, - 0x0d, 0x1e, 0x53, 0x8a, 0x22, 0xa8, 0x72, 0xea, 0xf7, 0x7a, 0xa2, 0x85, 0x51, 0xdb, 0x5f, 0x9d, - 0xe2, 0xe1, 0x45, 0x21, 0xa5, 0xce, 0xd6, 0x04, 0x86, 0x8d, 0x12, 0xb4, 0x09, 0xe0, 0x91, 0x38, - 0x88, 0x86, 0xc2, 0x09, 0x3a, 0x9a, 0xde, 0x3a, 0xea, 0x3e, 0xef, 0x44, 0x9e, 0x0c, 0xc7, 0x0b, - 0x22, 0xf8, 0xdb, 0x66, 0x09, 0xce, 0x2c, 0x47, 0x9f, 0x59, 0x70, 0x9e, 0x64, 0x5f, 0x2b, 0x74, - 0x72, 0xfe, 0x78, 0x4a, 0x27, 0x26, 0x70, 0xad, 0x8b, 0xa3, 0xc3, 0xe5, 0xf1, 0x37, 0x16, 0x3c, - 0xae, 0xd0, 0xfe, 0x4f, 0x09, 0xe6, 0xb2, 0x21, 0x9d, 0x4e, 0x18, 0xd6, 0x49, 0x27, 0x8c, 0x1f, - 0x66, 0x27, 0x0c, 0x75, 0x93, 0xbf, 0x75, 0xb2, 0xf0, 0x3e, 0xc1, 0x70, 0xe1, 0x8c, 0x0f, 0x17, - 0xc5, 0xd7, 0x86, 0x7f, 0xad, 0xb9, 0xa2, 0xf4, 0x8a, 0xb9, 0xe2, 0x00, 0xca, 0x61, 0xe4, 0x11, - 0x56, 0x2f, 0xcb, 0x58, 0x7b, 0x70, 0x36, 0x69, 0xa4, 0x21, 0x5c, 0xaa, 0xbb, 0x75, 0x73, 0xf7, - 0x24, 0x0d, 0x2b, 0x75, 0x68, 0x15, 0xe6, 0xb5, 0xc5, 0x7e, 0x14, 0xae, 0x45, 0x83, 0x50, 0x8d, - 0x72, 0xe5, 0xf4, 0x1d, 0x61, 0x6d, 0x9c, 0x8d, 0xf3, 0xf2, 0x8b, 0x3f, 0x53, 0xa3, 0xee, 0xb1, - 0x5d, 0xe6, 0xe3, 0x6c, 0x97, 0x39, 0x55, 0x2e, 0x4e, 0x27, 0xea, 0x6c, 0xaf, 0xda, 0x01, 0x48, - 0x1f, 0x36, 0x45, 0xdf, 0x27, 0xcf, 0x38, 0xdf, 0xf7, 0xc9, 0x18, 0xc0, 0x8a, 0x27, 0xfa, 0x3e, - 0xc6, 0xa3, 0x38, 0xdf, 0xf7, 0x75, 0x78, 0x14, 0x63, 0xc9, 0xb1, 0xff, 0x5a, 0x80, 0x19, 0x7d, - 0x49, 0x4f, 0xf0, 0x42, 0x4b, 0xa1, 0x4a, 0x75, 0x1f, 0xaa, 0x77, 0x79, 0xe7, 0xac, 0x26, 0x2e, - 0xd5, 0x0b, 0x25, 0x34, 0x6c, 0xf4, 0x64, 0x83, 0xab, 0xf8, 0x8a, 0xe0, 0x12, 0xd9, 0x80, 0x92, - 0x38, 0x30, 0x4d, 0xea, 0xf4, 0xd9, 0x60, 0xac, 0xe7, 0x55, 0xd9, 0x60, 0x8c, 0x84, 0xc7, 0x15, - 0xda, 0x7f, 0x2a, 0x40, 0xf1, 0x21, 0xde, 0x90, 0xcd, 0x82, 0xbb, 0x47, 0x8c, 0x37, 0xd3, 0x3a, - 0x27, 0xa9, 0x58, 0x73, 0x85, 0xcf, 0x07, 0x8c, 0xd0, 0xfc, 0x09, 0x3d, 0x64, 0x84, 0x62, 0xc9, - 0x11, 0x0d, 0x58, 0xec, 0x30, 0xf6, 0xe3, 0x88, 0x26, 0xaf, 0x83, 0x26, 0xbb, 0xee, 0x68, 0x3a, - 0x36, 0x12, 0x02, 0x6f, 0x2f, 0x62, 0x5c, 0xdf, 0xc3, 0xf4, 0x89, 0x35, 0x12, 0xc3, 0x84, 0xe0, - 0x98, 0xf7, 0xc3, 0xb2, 0x0c, 0xff, 0x23, 0xde, 0x0f, 0xcd, 0xb4, 0x50, 0x39, 0x76, 0x5a, 0x78, - 0x07, 0xca, 0xcf, 0x06, 0x84, 0x0e, 0xe5, 0x53, 0x45, 0x26, 0xf8, 0x1e, 0x08, 0x22, 0x56, 0x3c, - 0x61, 0x78, 0x97, 0x3a, 0xbd, 0xbe, 0xe8, 0xfa, 0xab, 0xe3, 0x86, 0xdf, 0xd6, 0x74, 0x6c, 0x24, - 0x6c, 0x17, 0x66, 0x33, 0x7f, 0x32, 0x3f, 0xc1, 0x9f, 0x67, 0x6f, 0x02, 0x1c, 0x10, 0xea, 0x77, - 0x87, 0x6b, 0x84, 0x72, 0xfd, 0x64, 0x69, 0x7a, 0xa5, 0x47, 0x86, 0x83, 0x33, 0x52, 0xad, 0xc6, - 0x8b, 0x97, 0x4b, 0xe7, 0xbe, 0x7c, 0xb9, 0x74, 0xee, 0xab, 0x97, 0x4b, 0xe7, 0x3e, 0x1b, 0x2d, - 0x59, 0x2f, 0x46, 0x4b, 0xd6, 0x97, 0xa3, 0x25, 0xeb, 0xab, 0xd1, 0x92, 0xf5, 0xaf, 0xd1, 0x92, - 0xf5, 0xc5, 0xbf, 0x97, 0xce, 0x3d, 0xae, 0x26, 0xa7, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xbe, 0x5c, 0xc6, 0xc6, 0xb5, 0x22, 0x00, 0x00, + 0x15, 0xf7, 0xf2, 0x4b, 0xe4, 0x93, 0x6c, 0xc9, 0xe3, 0x18, 0x21, 0x14, 0x44, 0x34, 0x36, 0x68, + 0xe0, 0x16, 0x31, 0x69, 0x5b, 0x4d, 0xe1, 0x16, 0x4d, 0x1b, 0x51, 0x94, 0x63, 0x59, 0xb2, 0x2c, + 0x0f, 0x63, 0x07, 0x70, 0x03, 0x54, 0xab, 0xdd, 0x21, 0xb5, 0xd6, 0x72, 0x77, 0x3d, 0x33, 0x54, + 0xcd, 0xa2, 0x68, 0x93, 0x7e, 0x5c, 0x7a, 0x28, 0x72, 0xef, 0xb1, 0xff, 0x40, 0x2f, 0x2d, 0x7a, + 0xee, 0xc9, 0x97, 0x02, 0x29, 0x0a, 0x14, 0xe9, 0x45, 0xa8, 0x59, 0xa0, 0x87, 0xa2, 0x7f, 0x81, + 0x4f, 0xc1, 0x7c, 0xec, 0xec, 0x92, 0x94, 0x60, 0x59, 0xd4, 0xc5, 0xe6, 0xbe, 0xf7, 0xe6, 0xf7, + 0xde, 0xbc, 0x79, 0xf3, 0x3e, 0x46, 0x70, 0xa7, 0xeb, 0xf3, 0xbd, 0xfe, 0x6e, 0xdd, 0x8d, 0x7a, + 0x0d, 0x87, 0x76, 0xa3, 0x98, 0x46, 0x4f, 0xe4, 0x8f, 0x6b, 0xe4, 0x80, 0x84, 0x9c, 0x35, 0xe2, + 0xfd, 0x6e, 0xc3, 0x89, 0x7d, 0xd6, 0x60, 0x24, 0x64, 0x11, 0x6d, 0x1c, 0xdc, 0x70, 0x82, 0x78, + 0xcf, 0xb9, 0xd1, 0xe8, 0x92, 0x90, 0x50, 0x87, 0x13, 0xaf, 0x1e, 0xd3, 0x88, 0x47, 0xe8, 0x56, + 0x8a, 0x54, 0x4f, 0x90, 0xe4, 0x8f, 0x1f, 0x2b, 0xa4, 0x7a, 0xbc, 0xdf, 0xad, 0x0b, 0xa4, 0xba, + 0x42, 0xaa, 0x27, 0x48, 0x8b, 0xd7, 0x32, 0x36, 0x74, 0xa3, 0x6e, 0xd4, 0x90, 0x80, 0xbb, 0xfd, + 0x8e, 0xfc, 0x92, 0x1f, 0xf2, 0x97, 0x52, 0xb4, 0x68, 0xef, 0xdf, 0x62, 0x75, 0x3f, 0x12, 0x56, + 0x35, 0xdc, 0x88, 0x92, 0xc6, 0xc1, 0x84, 0x31, 0x8b, 0xdf, 0x4e, 0x65, 0x7a, 0x8e, 0xbb, 0xe7, + 0x87, 0x84, 0x0e, 0xd2, 0xad, 0xf4, 0x08, 0x77, 0x8e, 0x5a, 0xd5, 0x38, 0x6e, 0x15, 0xed, 0x87, + 0xdc, 0xef, 0x91, 0x89, 0x05, 0xdf, 0x79, 0xd5, 0x02, 0xe6, 0xee, 0x91, 0x9e, 0x33, 0xb1, 0x6e, + 0xf9, 0xb8, 0x75, 0x7d, 0xee, 0x07, 0x0d, 0x3f, 0xe4, 0x8c, 0xd3, 0xf1, 0x45, 0xf6, 0x3f, 0xf3, + 0xb0, 0xb0, 0x42, 0xb9, 0xdf, 0x71, 0x5c, 0xbe, 0x19, 0xb9, 0x0e, 0xf7, 0xa3, 0x10, 0x7d, 0x0a, + 0x39, 0xb6, 0x5c, 0xb5, 0xae, 0x58, 0x57, 0x67, 0x6f, 0xb6, 0xea, 0xa7, 0x3d, 0x82, 0x7a, 0x7b, + 0x39, 0x41, 0x6e, 0x96, 0x86, 0x87, 0xb5, 0x5c, 0x7b, 0x19, 0xe7, 0xd8, 0x32, 0xb2, 0xa1, 0xe4, + 0x87, 0x81, 0x1f, 0x92, 0x6a, 0xee, 0x8a, 0x75, 0xb5, 0xd2, 0x84, 0xe1, 0x61, 0xad, 0xb4, 0x2e, + 0x29, 0x58, 0x73, 0x90, 0x07, 0x85, 0x8e, 0x1f, 0x90, 0x6a, 0x5e, 0xda, 0x70, 0xfb, 0xf4, 0x36, + 0xdc, 0xf6, 0x03, 0x62, 0xac, 0x28, 0x0f, 0x0f, 0x6b, 0x05, 0x41, 0xc1, 0x12, 0x1d, 0xed, 0x40, + 0xbe, 0x4f, 0x83, 0x6a, 0x41, 0x2a, 0x59, 0x3b, 0xbd, 0x92, 0x87, 0x78, 0xd3, 0xe8, 0x98, 0x19, + 0x1e, 0xd6, 0xf2, 0x0f, 0xf1, 0x26, 0x16, 0xd0, 0xe8, 0x19, 0x54, 0xdc, 0x28, 0xec, 0xf8, 0xdd, + 0x9e, 0x13, 0x57, 0x8b, 0x52, 0xcf, 0xc6, 0xe9, 0xf5, 0xac, 0x26, 0x50, 0x46, 0xdb, 0xf9, 0xe1, + 0x61, 0xad, 0x62, 0xc8, 0x38, 0x55, 0x66, 0xff, 0xc6, 0x82, 0x8b, 0x13, 0xf2, 0xe8, 0x0a, 0x14, + 0x42, 0xa7, 0x47, 0xe4, 0xd9, 0x56, 0x9a, 0x73, 0xcf, 0x0f, 0x6b, 0xe7, 0x84, 0x4f, 0xb6, 0x9c, + 0x1e, 0xc1, 0x92, 0x83, 0x1a, 0x50, 0x11, 0xff, 0xb3, 0xd8, 0x71, 0x93, 0x03, 0xba, 0xa8, 0xc5, + 0x2a, 0x5b, 0x09, 0x03, 0xa7, 0x32, 0xe8, 0x6d, 0xc8, 0xef, 0x93, 0x81, 0x3c, 0xa9, 0x4a, 0x73, + 0x56, 0x8b, 0xe6, 0x37, 0xc8, 0x00, 0x0b, 0xba, 0xcd, 0xa0, 0xd0, 0x72, 0xb8, 0x83, 0xf6, 0x61, + 0xa6, 0xe3, 0x07, 0x9c, 0x50, 0x56, 0xb5, 0xae, 0xe4, 0xa7, 0x0b, 0x2c, 0x01, 0x78, 0x5b, 0x82, + 0x35, 0x67, 0x87, 0x87, 0xb5, 0x19, 0xf5, 0x9b, 0xe1, 0x44, 0x83, 0xfd, 0xb9, 0x05, 0x90, 0x0a, + 0x89, 0x5d, 0xc7, 0x0e, 0xdf, 0x1b, 0xdf, 0xf5, 0xb6, 0xc3, 0xf7, 0xb0, 0xe4, 0xa0, 0xf7, 0xa0, + 0xc0, 0x07, 0x71, 0xb2, 0xe1, 0x6a, 0x22, 0xf1, 0xf1, 0x20, 0x26, 0x2f, 0x0f, 0x6b, 0xe5, 0xbb, + 0xed, 0xfb, 0x5b, 0xe2, 0x37, 0x96, 0x52, 0xe8, 0x1d, 0x28, 0x1e, 0x38, 0x41, 0x9f, 0xe8, 0x4d, + 0x9f, 0xd7, 0xe2, 0xc5, 0x47, 0x82, 0x88, 0x15, 0xcf, 0xfe, 0xbd, 0x05, 0xc5, 0x35, 0xb1, 0x11, + 0xf4, 0x14, 0x66, 0xdc, 0x28, 0xe4, 0xe4, 0x19, 0xd7, 0x77, 0x6a, 0x8a, 0x78, 0x96, 0x88, 0xab, + 0x0a, 0xad, 0x39, 0xaf, 0x15, 0xcf, 0x68, 0x02, 0x4e, 0xf4, 0xa0, 0x1a, 0x14, 0x3c, 0x87, 0x3b, + 0x72, 0x3f, 0x73, 0xca, 0x49, 0xdb, 0xce, 0x20, 0x88, 0x1c, 0x0f, 0x4b, 0x86, 0xfd, 0xc7, 0x12, + 0xcc, 0x65, 0xb1, 0xc4, 0xb9, 0x4b, 0xdd, 0x62, 0x9b, 0xda, 0x51, 0xe6, 0xdc, 0xd7, 0x12, 0x06, + 0x4e, 0x65, 0x50, 0x0b, 0x16, 0xcc, 0xc7, 0x23, 0x42, 0x99, 0x1f, 0x85, 0x63, 0xee, 0x5b, 0x58, + 0x1b, 0xe3, 0xe3, 0x89, 0x15, 0xe8, 0x2e, 0x20, 0x37, 0x88, 0xfa, 0x9e, 0x14, 0x65, 0x09, 0x8e, + 0xf2, 0xeb, 0xa2, 0xc6, 0x41, 0xab, 0x13, 0x12, 0xf8, 0x88, 0x55, 0xc8, 0x81, 0x12, 0x8b, 0xfa, + 0xd4, 0x25, 0xfa, 0x46, 0x7f, 0x30, 0xcd, 0x8d, 0x5e, 0x57, 0x79, 0xa9, 0x2d, 0x01, 0xb1, 0x06, + 0x46, 0xdf, 0x84, 0x19, 0xb9, 0x74, 0xbd, 0x25, 0x6f, 0x73, 0x25, 0x3d, 0x82, 0x35, 0x45, 0xc6, + 0x09, 0x1f, 0xed, 0x24, 0x0e, 0xf5, 0x7b, 0xa4, 0x5a, 0x92, 0x06, 0x35, 0xea, 0x2a, 0x45, 0xd7, + 0xb3, 0x29, 0x3a, 0x35, 0x42, 0x54, 0x90, 0xfa, 0xc1, 0x8d, 0xfa, 0x3d, 0xdf, 0xa5, 0x91, 0x58, + 0x36, 0x7e, 0x02, 0x7e, 0xcf, 0x9c, 0x80, 0xdf, 0x23, 0xe8, 0x09, 0x54, 0x54, 0x29, 0x78, 0x88, + 0x37, 0xab, 0x33, 0x67, 0xb1, 0x65, 0x99, 0x4e, 0xda, 0x09, 0x26, 0x4e, 0xe1, 0xd1, 0xfb, 0x30, + 0x2b, 0x63, 0x4b, 0x07, 0x48, 0x59, 0x6e, 0xfe, 0x92, 0x36, 0x6f, 0x76, 0x35, 0x65, 0xe1, 0xac, + 0x1c, 0xfa, 0xad, 0x05, 0x40, 0x9e, 0x71, 0x12, 0x8a, 0x03, 0x62, 0xd5, 0x8a, 0xbc, 0xf9, 0x8f, + 0xce, 0x26, 0xfc, 0xeb, 0x6b, 0x06, 0x78, 0x2d, 0xe4, 0x74, 0xd0, 0x44, 0xda, 0x1c, 0x48, 0x19, + 0x38, 0xa3, 0x7d, 0xf1, 0x03, 0x98, 0x1f, 0x5b, 0x82, 0x16, 0x54, 0xf2, 0x92, 0xf1, 0x2e, 0xf3, + 0x15, 0x7a, 0x23, 0xb9, 0xdb, 0x32, 0x96, 0xf5, 0x65, 0xfe, 0x5e, 0xee, 0x96, 0x65, 0xff, 0x2e, + 0x07, 0xf3, 0x52, 0x7f, 0x8b, 0xc4, 0x24, 0xf4, 0x48, 0xe8, 0x0e, 0x4e, 0x90, 0x4f, 0xdf, 0x83, + 0xb2, 0x47, 0x1c, 0xcf, 0xd4, 0xbb, 0x7c, 0x73, 0x41, 0x4b, 0x95, 0x5b, 0x9a, 0x8e, 0x8d, 0x04, + 0xfa, 0x69, 0x9a, 0x25, 0x55, 0xe9, 0xbb, 0x3f, 0xa5, 0xaf, 0x52, 0x5b, 0x75, 0xc2, 0x34, 0x01, + 0x3b, 0x9e, 0x34, 0x45, 0x06, 0x70, 0xa3, 0x30, 0x24, 0x2e, 0x27, 0x9e, 0xbc, 0x41, 0xe5, 0x34, + 0xfe, 0x56, 0x13, 0x06, 0x4e, 0x65, 0xec, 0xff, 0xe5, 0xe0, 0xf2, 0x91, 0x4a, 0x4e, 0xe0, 0x96, + 0x5d, 0x28, 0x88, 0x5e, 0x46, 0xba, 0x64, 0xaa, 0x5a, 0x20, 0x6e, 0x82, 0xde, 0x9a, 0x2c, 0xef, + 0xf2, 0x92, 0x48, 0x6c, 0xd4, 0x4b, 0xf3, 0x6e, 0xfe, 0x4c, 0xf3, 0xee, 0xec, 0x91, 0x39, 0xf7, + 0x53, 0x9d, 0x73, 0x55, 0xf2, 0xf9, 0xc1, 0x74, 0xe5, 0x4d, 0x6d, 0x46, 0xfc, 0xd2, 0x09, 0xfb, + 0x4f, 0x39, 0x38, 0x2f, 0x8d, 0xd8, 0x16, 0x7d, 0x9b, 0x1b, 0x05, 0x68, 0x47, 0xd7, 0x2c, 0xe5, + 0xe4, 0xcd, 0xb1, 0x9a, 0xf5, 0xfd, 0x93, 0xf4, 0xe0, 0x6e, 0xd4, 0xeb, 0x45, 0x61, 0x7d, 0x04, + 0x37, 0x53, 0xe7, 0x76, 0xa0, 0xb0, 0xc7, 0x79, 0xac, 0x0f, 0x69, 0x8a, 0x1d, 0xdd, 0xe1, 0x3c, + 0x4e, 0xc3, 0x40, 0x7c, 0x61, 0x89, 0x2c, 0x34, 0x84, 0x0e, 0x4f, 0x82, 0x7d, 0x0a, 0x0d, 0x5b, + 0x0e, 0x67, 0xd9, 0x40, 0xe3, 0x0c, 0x4b, 0x64, 0xfb, 0x3a, 0xcc, 0x65, 0x7b, 0xc0, 0x57, 0xf7, + 0x02, 0xf6, 0xaf, 0x2d, 0x58, 0xf8, 0x88, 0x46, 0xfd, 0x58, 0xd7, 0x95, 0x0d, 0x3f, 0xf4, 0x44, + 0xc9, 0xef, 0x0a, 0x9a, 0x5e, 0x67, 0x4a, 0xbe, 0x14, 0xc4, 0x8a, 0x27, 0xaa, 0xc3, 0xc1, 0x48, + 0x25, 0x34, 0x97, 0x2d, 0x29, 0x5b, 0x09, 0x5f, 0x98, 0xb1, 0xef, 0x87, 0x9e, 0xae, 0x74, 0xc6, + 0x0c, 0xa1, 0x0b, 0x4b, 0x8e, 0x7d, 0x15, 0xa4, 0xa3, 0xa4, 0xc1, 0x11, 0xe5, 0x13, 0x06, 0x47, + 0x94, 0x63, 0xc9, 0xb1, 0xff, 0x5f, 0x00, 0xb9, 0x63, 0xd1, 0x8a, 0x89, 0x7e, 0xd6, 0x1a, 0x6d, + 0xc5, 0x4c, 0x33, 0xda, 0x86, 0xcb, 0x8c, 0x3b, 0x94, 0x7f, 0xe2, 0xf3, 0xbd, 0x4d, 0x87, 0x71, + 0x4c, 0x5c, 0xe2, 0x1f, 0x10, 0x4f, 0x1a, 0x5b, 0x6e, 0xbe, 0xad, 0x17, 0x5c, 0x6e, 0x1f, 0x25, + 0x84, 0x8f, 0x5e, 0x8b, 0xee, 0xc1, 0x25, 0x8f, 0x04, 0xfe, 0x01, 0xa1, 0x2b, 0x41, 0xb0, 0x72, + 0xe0, 0xf8, 0x81, 0xb3, 0xab, 0x1b, 0xf7, 0x72, 0xf3, 0x2d, 0x0d, 0x79, 0xa9, 0x35, 0x29, 0x82, + 0x8f, 0x5a, 0x87, 0x56, 0x60, 0x5e, 0xea, 0x59, 0xe1, 0x6d, 0xf2, 0xb4, 0x4f, 0x42, 0x5d, 0xcc, + 0x2b, 0xcd, 0x37, 0x35, 0xd4, 0x7c, 0x7b, 0x94, 0x8d, 0xc7, 0xe5, 0x45, 0xa9, 0xd2, 0x24, 0x59, + 0x7a, 0x8b, 0xa3, 0xa5, 0xaa, 0x9d, 0xb2, 0x70, 0x56, 0x4e, 0xf4, 0x33, 0x99, 0xcf, 0x16, 0x09, + 0xb8, 0x23, 0xcb, 0x76, 0xa6, 0x9f, 0x69, 0x8f, 0xf1, 0xf1, 0xc4, 0x0a, 0x11, 0x02, 0x5e, 0x9f, + 0x4a, 0x17, 0xcc, 0x48, 0x17, 0x98, 0x10, 0x68, 0x29, 0x32, 0x4e, 0xf8, 0x32, 0xdf, 0x06, 0x7d, + 0xc6, 0x09, 0x5d, 0xf7, 0x74, 0x41, 0x4d, 0xf3, 0x6d, 0xc2, 0xc0, 0xa9, 0x8c, 0x28, 0x25, 0x6e, + 0xe0, 0x8b, 0xee, 0xc2, 0xab, 0x56, 0xa4, 0xbc, 0x29, 0x25, 0xab, 0x9a, 0x8e, 0x8d, 0x04, 0xfa, + 0x44, 0xa7, 0x07, 0x90, 0x92, 0xab, 0x63, 0xe9, 0x61, 0xf9, 0x35, 0xd2, 0x83, 0x88, 0xad, 0x34, + 0x2b, 0xd8, 0x7f, 0x29, 0x00, 0x6c, 0x45, 0x1e, 0x69, 0x73, 0x87, 0xf7, 0x19, 0x5a, 0x84, 0x9c, + 0xef, 0xe9, 0x98, 0x03, 0xad, 0x25, 0xb7, 0xde, 0xc2, 0x39, 0xdf, 0x33, 0x75, 0x20, 0x77, 0x6c, + 0x1d, 0x78, 0x1f, 0x66, 0x3d, 0x9f, 0xc5, 0x81, 0x33, 0x10, 0x44, 0x7d, 0x1d, 0xcc, 0x61, 0xb5, + 0x52, 0x16, 0xce, 0xca, 0x99, 0x7e, 0xbd, 0x70, 0x74, 0xbf, 0x2e, 0xcc, 0xcb, 0xe4, 0xb1, 0xeb, + 0x50, 0x8c, 0xf7, 0x1c, 0x96, 0xc4, 0x42, 0xd2, 0x57, 0x16, 0xb7, 0x05, 0xf1, 0xa5, 0x18, 0x6c, + 0x22, 0x8f, 0xc8, 0x0f, 0xac, 0x04, 0x45, 0xf3, 0x26, 0x8f, 0x96, 0x78, 0x2b, 0x7c, 0xea, 0xe6, + 0xad, 0x9d, 0x20, 0xe1, 0x14, 0x14, 0x75, 0x44, 0x43, 0xd5, 0x8b, 0x03, 0xa2, 0x74, 0xcc, 0x9c, + 0x4e, 0x47, 0xa6, 0x03, 0x33, 0x58, 0x38, 0x0b, 0x2c, 0x02, 0xb2, 0x47, 0x18, 0x73, 0xba, 0x49, + 0xd3, 0x66, 0x02, 0xf2, 0x9e, 0x22, 0xe3, 0x84, 0x8f, 0x76, 0xa0, 0x28, 0x0f, 0x5f, 0x06, 0xd7, + 0xec, 0xcd, 0x1f, 0x4e, 0x59, 0x2d, 0x9b, 0x15, 0xe1, 0x63, 0xf9, 0x13, 0x2b, 0x60, 0xfb, 0x97, + 0x45, 0xb8, 0x80, 0x89, 0xea, 0xa5, 0xef, 0xef, 0x3e, 0x21, 0x2e, 0x1f, 0x9d, 0x37, 0xad, 0x13, + 0xcc, 0x9b, 0x3f, 0x83, 0x52, 0xe0, 0xec, 0x92, 0x40, 0x14, 0x0d, 0xd1, 0x4d, 0x7e, 0x7c, 0x7a, + 0x33, 0x47, 0x4d, 0xa9, 0x6f, 0x4a, 0x58, 0xd5, 0x4b, 0x5e, 0xd0, 0x36, 0x94, 0x14, 0x11, 0x6b, + 0x9d, 0xe8, 0x17, 0x00, 0xb1, 0x43, 0x9d, 0x1e, 0x91, 0x3d, 0x5a, 0x41, 0x5a, 0xb0, 0x31, 0xbd, + 0x05, 0xdb, 0x09, 0x66, 0xda, 0xc4, 0x1a, 0x12, 0xc3, 0x19, 0x95, 0xe8, 0x0b, 0x0b, 0x16, 0xba, + 0x63, 0xd5, 0x49, 0xbf, 0x2c, 0xdc, 0x3d, 0xbd, 0x1d, 0xe3, 0xf5, 0x2e, 0xcd, 0x79, 0xe3, 0x1c, + 0x3c, 0xa1, 0x1d, 0x51, 0x33, 0x77, 0x95, 0xa6, 0xb5, 0x63, 0xfc, 0x29, 0x2a, 0x3d, 0x87, 0xd1, + 0x41, 0x6c, 0xf1, 0xbb, 0x30, 0x9b, 0x39, 0xae, 0xd7, 0xea, 0xe3, 0xff, 0x60, 0xc1, 0xc5, 0x09, + 0xbf, 0xa3, 0x00, 0xf2, 0x8c, 0xba, 0x7a, 0x40, 0x7f, 0x70, 0x86, 0x27, 0xaa, 0x0c, 0x57, 0xef, + 0x42, 0x6d, 0xea, 0x62, 0xa1, 0x46, 0x24, 0x46, 0x8f, 0x30, 0x3e, 0x9e, 0x18, 0x5b, 0x84, 0x71, + 0x2c, 0x39, 0xf6, 0xe7, 0x16, 0xbc, 0x79, 0x0c, 0x96, 0x68, 0x46, 0xd4, 0x45, 0x1d, 0x6b, 0x46, + 0xb2, 0x77, 0xcd, 0x34, 0x3a, 0xb9, 0x63, 0x1f, 0x3d, 0x6a, 0xa3, 0xcf, 0x18, 0x95, 0x89, 0x27, + 0x8c, 0x79, 0x38, 0x8f, 0x09, 0xa7, 0x83, 0x36, 0xa7, 0x0e, 0x27, 0xdd, 0x81, 0xfd, 0xaf, 0x1c, + 0x40, 0xfa, 0xaa, 0x97, 0x3c, 0xfd, 0x58, 0x47, 0x3f, 0xfd, 0xa0, 0x47, 0x89, 0x99, 0xca, 0x84, + 0x0f, 0x47, 0xcc, 0x7c, 0x79, 0x58, 0x6b, 0x64, 0x6a, 0x50, 0xcf, 0x0f, 0xfd, 0x48, 0xfd, 0x7b, + 0xad, 0x1b, 0xd5, 0xb7, 0x22, 0xee, 0x77, 0x7c, 0x15, 0x03, 0xe9, 0xeb, 0x83, 0xde, 0x59, 0x07, + 0x4a, 0x6a, 0x66, 0xd1, 0x6d, 0x63, 0x73, 0x9a, 0x27, 0x4a, 0x3d, 0x3b, 0xc8, 0x61, 0x5f, 0xfd, + 0xc6, 0x1a, 0x1d, 0x05, 0x50, 0x66, 0xcb, 0xcd, 0xbe, 0xbb, 0x4f, 0xb8, 0x6e, 0xea, 0xa7, 0xd2, + 0xa4, 0x90, 0x9a, 0x73, 0xa2, 0x5e, 0x27, 0x5f, 0xd8, 0x68, 0xb0, 0x0f, 0x73, 0x60, 0xc8, 0xa2, + 0xd4, 0x93, 0xd0, 0x8b, 0x23, 0xdf, 0x1c, 0xb2, 0x29, 0xf5, 0x6b, 0x9a, 0x8e, 0x8d, 0x04, 0x7a, + 0x17, 0x4a, 0xbb, 0xca, 0x4c, 0xe5, 0x69, 0x73, 0x69, 0xb4, 0x12, 0xcd, 0x15, 0x72, 0x94, 0x74, + 0xd3, 0x07, 0x16, 0x23, 0x87, 0x25, 0x15, 0x6b, 0xae, 0xd0, 0xee, 0x87, 0x8c, 0xb8, 0x7d, 0x4a, + 0xf4, 0x20, 0x68, 0xb4, 0xaf, 0x6b, 0x3a, 0x36, 0x12, 0x08, 0x43, 0xc5, 0x71, 0x5d, 0xc2, 0xd8, + 0x06, 0x19, 0xe8, 0x4c, 0xf4, 0x8d, 0x4c, 0x1d, 0xab, 0xbb, 0x11, 0x25, 0xa2, 0x6a, 0xb5, 0x89, + 0x4b, 0x09, 0xdf, 0x20, 0x83, 0x36, 0x09, 0x88, 0xcb, 0x23, 0xaa, 0x9e, 0x1b, 0x56, 0x92, 0xb5, + 0x38, 0x85, 0x11, 0x98, 0x2c, 0x11, 0xd7, 0x59, 0xe5, 0x75, 0x30, 0x0d, 0x19, 0xa7, 0x30, 0xf6, + 0x63, 0xe1, 0x5f, 0x3d, 0xa0, 0xbe, 0x0b, 0xa5, 0x98, 0x92, 0x8e, 0xff, 0x4c, 0x7b, 0xd7, 0x78, + 0x62, 0x5b, 0x52, 0xb1, 0xe6, 0x0a, 0x39, 0xd6, 0xef, 0x08, 0xb9, 0x31, 0xcf, 0xb6, 0x25, 0x15, + 0x6b, 0xae, 0xfd, 0xd7, 0x1c, 0x94, 0xda, 0xf2, 0xc4, 0xd1, 0x0e, 0x94, 0x45, 0x9d, 0x96, 0xa3, + 0xa0, 0xca, 0x26, 0xd7, 0x4f, 0x56, 0xd5, 0x55, 0x15, 0xba, 0x47, 0xb8, 0x93, 0x16, 0x81, 0x94, + 0x86, 0x0d, 0x2a, 0xea, 0x40, 0x81, 0xc5, 0xc4, 0x9d, 0x7e, 0x76, 0x56, 0x16, 0xb7, 0x63, 0xe2, + 0xa6, 0xf9, 0x41, 0x7c, 0x61, 0x89, 0x8f, 0x42, 0x28, 0x31, 0xd9, 0xe3, 0x4d, 0x3f, 0x3e, 0x6b, + 0x4d, 0x12, 0x2d, 0xe3, 0x44, 0xf9, 0x8d, 0xb5, 0x16, 0xfb, 0xef, 0x16, 0x80, 0x12, 0xdc, 0xf4, + 0x99, 0x98, 0xa7, 0xc7, 0x1d, 0x59, 0x3f, 0x99, 0x23, 0xc5, 0x6a, 0xe9, 0x46, 0x13, 0xb5, 0x09, + 0x25, 0xe3, 0x44, 0x02, 0x45, 0x9f, 0x93, 0x1e, 0xab, 0xe6, 0x64, 0x0d, 0xff, 0x70, 0xda, 0xbd, + 0xa5, 0x59, 0x78, 0x5d, 0xc0, 0x62, 0x85, 0x6e, 0xff, 0x23, 0x9f, 0xec, 0x49, 0x38, 0x16, 0xfd, + 0xca, 0x82, 0x39, 0x2f, 0x79, 0x2d, 0xf1, 0x49, 0xf2, 0x16, 0xbe, 0x7e, 0x66, 0xaf, 0x3c, 0xcd, + 0x37, 0xb4, 0x19, 0x73, 0xad, 0x8c, 0x1a, 0x3c, 0xa2, 0x14, 0x45, 0x50, 0xe6, 0xd4, 0xef, 0x76, + 0x45, 0x0b, 0xa3, 0xb6, 0xbf, 0x32, 0xc5, 0x03, 0x8c, 0x42, 0x4a, 0x9d, 0xad, 0x09, 0x0c, 0x1b, + 0x25, 0x68, 0x03, 0xc0, 0x23, 0x71, 0x10, 0x0d, 0x84, 0x13, 0x74, 0x34, 0xbd, 0x75, 0xd4, 0x7d, + 0xde, 0x8e, 0x3c, 0x19, 0x8e, 0x17, 0x44, 0xf0, 0xb7, 0xcc, 0x12, 0x9c, 0x59, 0x8e, 0x3e, 0xb3, + 0xe0, 0x3c, 0xc9, 0xbe, 0x58, 0xe8, 0xe4, 0xfc, 0xd1, 0x94, 0x4e, 0x4c, 0xe0, 0x9a, 0x17, 0x87, + 0x87, 0xb5, 0xd1, 0xb7, 0x16, 0x3c, 0xaa, 0xd0, 0xfe, 0x6f, 0x01, 0xe6, 0xb2, 0x21, 0x9d, 0x4e, + 0x18, 0xd6, 0x49, 0x27, 0x8c, 0x1f, 0x65, 0x27, 0x0c, 0x75, 0x93, 0xbf, 0x75, 0xb2, 0xf0, 0x3e, + 0xc1, 0x70, 0xe1, 0x8c, 0x0e, 0x17, 0xf9, 0xd7, 0x86, 0x7f, 0xad, 0xb9, 0xa2, 0xf0, 0x8a, 0xb9, + 0xe2, 0x00, 0x8a, 0x61, 0xe4, 0x11, 0x56, 0x2d, 0xca, 0x58, 0x7b, 0x70, 0x36, 0x69, 0xa4, 0x2e, + 0x5c, 0xaa, 0xbb, 0x75, 0x73, 0xf7, 0x24, 0x0d, 0x2b, 0x75, 0x68, 0x05, 0xe6, 0xb5, 0xc5, 0x7e, + 0x14, 0xae, 0x46, 0xfd, 0x50, 0x8d, 0x72, 0xc5, 0xf4, 0x2d, 0x61, 0x75, 0x94, 0x8d, 0xc7, 0xe5, + 0x17, 0x7f, 0xae, 0x46, 0xdd, 0x63, 0xbb, 0xcc, 0xc7, 0xd9, 0x2e, 0x73, 0xaa, 0x5c, 0x9c, 0x4e, + 0xd4, 0xd9, 0x5e, 0xb5, 0x0d, 0x90, 0x3e, 0x70, 0x8a, 0xbe, 0x4f, 0x9e, 0xf1, 0x78, 0xdf, 0x27, + 0x63, 0x00, 0x2b, 0x9e, 0xe8, 0xfb, 0x18, 0x8f, 0xe2, 0xf1, 0xbe, 0xaf, 0xcd, 0xa3, 0x18, 0x4b, + 0x8e, 0xfd, 0xb7, 0x1c, 0xcc, 0xe8, 0x4b, 0x7a, 0x82, 0x97, 0x5a, 0x0a, 0x65, 0xaa, 0xfb, 0x50, + 0xbd, 0xcb, 0x3b, 0x67, 0x35, 0x71, 0xa9, 0x5e, 0x28, 0xa1, 0x61, 0xa3, 0x27, 0x1b, 0x5c, 0xf9, + 0x57, 0x04, 0x97, 0xc8, 0x06, 0x94, 0xc4, 0x81, 0x69, 0x52, 0xa7, 0xcf, 0x06, 0x23, 0x3d, 0xaf, + 0xca, 0x06, 0x23, 0x24, 0x3c, 0xaa, 0xd0, 0xfe, 0x73, 0x0e, 0xf2, 0x0f, 0xf1, 0xba, 0x6c, 0x16, + 0xdc, 0x3d, 0x62, 0xbc, 0x99, 0xd6, 0x39, 0x49, 0xc5, 0x9a, 0x2b, 0x7c, 0xde, 0x67, 0x84, 0x8e, + 0x9f, 0xd0, 0x43, 0x46, 0x28, 0x96, 0x1c, 0xd1, 0x80, 0xc5, 0x0e, 0x63, 0x3f, 0x89, 0x68, 0xf2, + 0x42, 0x68, 0xb2, 0xeb, 0xb6, 0xa6, 0x63, 0x23, 0x21, 0xf0, 0xf6, 0x22, 0xc6, 0xf5, 0x3d, 0x4c, + 0x9f, 0x59, 0x23, 0x31, 0x4c, 0x08, 0x8e, 0x79, 0x43, 0x2c, 0xca, 0xf0, 0x3f, 0xe2, 0x0d, 0xd1, + 0x4c, 0x0b, 0xa5, 0x63, 0xa7, 0x85, 0x77, 0xa0, 0xf8, 0xb4, 0x4f, 0xe8, 0x40, 0x3e, 0x55, 0x64, + 0x82, 0xef, 0x81, 0x20, 0x62, 0xc5, 0x13, 0x86, 0x77, 0xa8, 0xd3, 0xed, 0x89, 0xae, 0xbf, 0x3c, + 0x6a, 0xf8, 0x6d, 0x4d, 0xc7, 0x46, 0xc2, 0x76, 0x61, 0x36, 0xf3, 0xa7, 0xf3, 0x13, 0xfc, 0x99, + 0xf6, 0x26, 0xc0, 0x01, 0xa1, 0x7e, 0x67, 0xb0, 0x4a, 0x28, 0xd7, 0xcf, 0x96, 0xa6, 0x57, 0x7a, + 0x64, 0x38, 0x38, 0x23, 0xd5, 0xac, 0x3f, 0x7f, 0xb1, 0x74, 0xee, 0xcb, 0x17, 0x4b, 0xe7, 0xbe, + 0x7a, 0xb1, 0x74, 0xee, 0xb3, 0xe1, 0x92, 0xf5, 0x7c, 0xb8, 0x64, 0x7d, 0x39, 0x5c, 0xb2, 0xbe, + 0x1a, 0x2e, 0x59, 0xff, 0x1e, 0x2e, 0x59, 0x5f, 0xfc, 0x67, 0xe9, 0xdc, 0xe3, 0x72, 0x72, 0xfa, + 0x5f, 0x07, 0x00, 0x00, 0xff, 0xff, 0x82, 0x82, 0x46, 0x88, 0xbd, 0x22, 0x00, 0x00, } diff --git a/pkg/apis/sensor/v1alpha1/types.go b/pkg/apis/sensor/v1alpha1/types.go index 22a6f0cdf5..3cb8df74e3 100644 --- a/pkg/apis/sensor/v1alpha1/types.go +++ b/pkg/apis/sensor/v1alpha1/types.go @@ -18,7 +18,7 @@ package v1alpha1 import ( "fmt" - "github.com/argoproj/argo-events/common" + "github.com/argoproj/argo-events/pkg/common" "hash/fnv" "github.com/minio/minio-go" diff --git a/pkg/common/common.go b/pkg/common/common.go new file mode 100644 index 0000000000..6b23d79551 --- /dev/null +++ b/pkg/common/common.go @@ -0,0 +1,35 @@ +/* +Copyright 2018 BlackRock, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package common + +// EventProtocolType is type of the event dispatch protocol. Used for dispatching events +type EventProtocolType string + +// possible types of event dispatch protocol +const ( + HTTP EventProtocolType = "HTTP" + NATS EventProtocolType = "NATS" +) + +// Type of nats connection. +type NatsType string + +// possible values of nats connection type +const ( + Standard NatsType = "Standard" + Streaming NatsType = "Streaming" +) diff --git a/sensors/event-handler.go b/sensors/event-handler.go index caa5c54ec4..9cf59fa8cc 100644 --- a/sensors/event-handler.go +++ b/sensors/event-handler.go @@ -27,6 +27,7 @@ import ( "github.com/argoproj/argo-events/pkg/apis/sensor" "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" ss_v1alpha1 "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" + pc "github.com/argoproj/argo-events/pkg/common" ) // processUpdateNotification processes event received by sensor, validates it, updates the state of the node representing the event dependency @@ -144,9 +145,9 @@ func (sec *sensorExecutionCtx) WatchEventsFromGateways() { go sec.syncSensor(context.Background()) switch sec.sensor.Spec.EventProtocol.Type { - case common.HTTP: + case pc.HTTP: sec.HttpEventProtocol() - case common.NATS: + case pc.NATS: sec.NatsEventProtocol() var err error if sec.sensor, err = sn.PersistUpdates(sec.sensorClient, sec.sensor, sec.controllerInstanceID, &sec.log); err != nil { diff --git a/sensors/nats-events-handler.go b/sensors/nats-events-handler.go index 19781c5814..ef450607ac 100644 --- a/sensors/nats-events-handler.go +++ b/sensors/nats-events-handler.go @@ -23,6 +23,7 @@ import ( "time" "github.com/argoproj/argo-events/common" + pc "github.com/argoproj/argo-events/pkg/common" "github.com/nats-io/go-nats" snats "github.com/nats-io/go-nats-streaming" ) @@ -92,7 +93,7 @@ func (sec *sensorExecutionCtx) NatsEventProtocol() { var err error switch sec.sensor.Spec.EventProtocol.Nats.Type { - case common.Standard: + case pc.Standard: if sec.nconn.standard == nil { sec.nconn.standard, err = nats.Connect(sec.sensor.Spec.EventProtocol.Nats.URL) if err != nil { @@ -118,7 +119,7 @@ func (sec *sensorExecutionCtx) NatsEventProtocol() { sec.successNatsSubscription(dependency.Name) } - case common.Streaming: + case pc.Streaming: if sec.nconn.stream == nil { sec.nconn.stream, err = snats.Connect(sec.sensor.Spec.EventProtocol.Nats.ClusterId, sec.sensor.Spec.EventProtocol.Nats.ClientId, snats.NatsURL(sec.sensor.Spec.EventProtocol.Nats.URL)) if err != nil { diff --git a/sensors/trigger.go b/sensors/trigger.go index 652277e9ab..315e02a8df 100644 --- a/sensors/trigger.go +++ b/sensors/trigger.go @@ -18,6 +18,7 @@ package sensors import ( "fmt" + "github.com/argoproj/argo-events/common" sn "github.com/argoproj/argo-events/controllers/sensor" "github.com/argoproj/argo-events/pkg/apis/sensor" diff --git a/sensors/trigger_test.go b/sensors/trigger_test.go index a59b482cba..1af95d1599 100644 --- a/sensors/trigger_test.go +++ b/sensors/trigger_test.go @@ -17,6 +17,8 @@ limitations under the License. package sensors import ( + "testing" + "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" "github.com/smartystreets/goconvey/convey" corev1 "k8s.io/api/core/v1" @@ -31,7 +33,6 @@ import ( "k8s.io/client-go/kubernetes/fake" kTesting "k8s.io/client-go/testing" "k8s.io/client-go/util/flowcontrol" - "testing" ) // Below code refers to PR https://github.com/kubernetes/kubernetes/issues/60390 From a58411e8580a542b2587c97ce101517bb839f395 Mon Sep 17 00:00:00 2001 From: vpage Date: Wed, 23 Jan 2019 18:55:40 -0500 Subject: [PATCH 13/22] Moving common structs in apis package --- controllers/gateway/validate.go | 10 +- controllers/sensor/operator.go | 2 +- controllers/sensor/state.go | 3 +- controllers/sensor/state_test.go | 3 +- controllers/sensor/validate.go | 2 +- gateways/config.go | 2 +- gateways/core/artifact/config.go | 47 +- gateways/core/artifact/start.go | 19 +- gateways/core/artifact/validate.go | 24 +- gateways/core/artifact/validate_test.go | 10 +- gateways/event-source_test.go | 2 +- gateways/transformer.go | 12 +- pkg/apis/common/deepcopy_generated.go | 165 + pkg/apis/common/doc.go | 2 + pkg/apis/common/event.go | 99 + pkg/apis/common/generated.pb.go | 2253 ++++++++++ pkg/apis/common/generated.proto | 130 + pkg/apis/common/s3.go | 46 + pkg/apis/gateway/v1alpha1/generated.pb.go | 191 +- pkg/apis/gateway/v1alpha1/generated.proto | 5 +- .../gateway/v1alpha1/openapi_generated.go | 55 +- pkg/apis/gateway/v1alpha1/types.go | 9 +- pkg/apis/sensor/v1alpha1/generated.pb.go | 3739 ++++------------- pkg/apis/sensor/v1alpha1/generated.proto | 108 +- pkg/apis/sensor/v1alpha1/openapi_generated.go | 298 +- pkg/apis/sensor/v1alpha1/types.go | 104 +- .../sensor/v1alpha1/zz_generated.deepcopy.go | 147 +- pkg/common/common.go | 35 - sensors/config.go | 7 +- sensors/event-handler.go | 11 +- sensors/event-handler_test.go | 21 +- sensors/nats-events-handler.go | 49 +- sensors/signal-filter.go | 10 +- sensors/signal-filter_test.go | 45 +- sensors/trigger-params.go | 6 +- sensors/trigger-params_test.go | 10 +- sensors/trigger.go | 6 +- store/creds.go | 4 +- store/creds_test.go | 22 +- store/file.go | 16 + store/file_test.go | 16 + store/inline.go | 16 + store/inline_test.go | 16 + store/s3.go | 18 +- 44 files changed, 3936 insertions(+), 3859 deletions(-) create mode 100644 pkg/apis/common/deepcopy_generated.go create mode 100644 pkg/apis/common/doc.go create mode 100644 pkg/apis/common/event.go create mode 100644 pkg/apis/common/generated.pb.go create mode 100644 pkg/apis/common/generated.proto create mode 100644 pkg/apis/common/s3.go delete mode 100644 pkg/common/common.go diff --git a/controllers/gateway/validate.go b/controllers/gateway/validate.go index 55b466b80e..43b6f2138a 100644 --- a/controllers/gateway/validate.go +++ b/controllers/gateway/validate.go @@ -18,8 +18,8 @@ package gateway import ( "fmt" + apicommon "github.com/argoproj/argo-events/pkg/apis/common" "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1" - "github.com/argoproj/argo-events/pkg/common" ) // Validate validates the gateway resource. @@ -35,24 +35,24 @@ func Validate(gw *v1alpha1.Gateway) error { return fmt.Errorf("gateway version is not specified") } switch gw.Spec.EventProtocol.Type { - case common.HTTP: + case apicommon.HTTP: if gw.Spec.Watchers == nil || (gw.Spec.Watchers.Gateways == nil && gw.Spec.Watchers.Sensors == nil) { return fmt.Errorf("no associated watchers with gateway") } if gw.Spec.EventProtocol.Http.Port == "" { return fmt.Errorf("http server port is not defined") } - case common.NATS: + case apicommon.NATS: if gw.Spec.EventProtocol.Nats.URL == "" { return fmt.Errorf("nats url is not defined") } if gw.Spec.EventProtocol.Nats.Type == "" { return fmt.Errorf("nats service type is not defined") } - if gw.Spec.EventProtocol.Nats.Type == common.Streaming && gw.Spec.EventProtocol.Nats.ClientId == "" { + if gw.Spec.EventProtocol.Nats.Type == apicommon.Streaming && gw.Spec.EventProtocol.Nats.ClientId == "" { return fmt.Errorf("client id must be specified when using nats streaming") } - if gw.Spec.EventProtocol.Nats.Type == common.Streaming && gw.Spec.EventProtocol.Nats.ClusterId == "" { + if gw.Spec.EventProtocol.Nats.Type == apicommon.Streaming && gw.Spec.EventProtocol.Nats.ClusterId == "" { return fmt.Errorf("cluster id must be specified when using nats streaming") } default: diff --git a/controllers/sensor/operator.go b/controllers/sensor/operator.go index c9c08a365f..63cac3888e 100644 --- a/controllers/sensor/operator.go +++ b/controllers/sensor/operator.go @@ -20,9 +20,9 @@ import ( "time" "github.com/argoproj/argo-events/common" + pc "github.com/argoproj/argo-events/pkg/apis/common" "github.com/argoproj/argo-events/pkg/apis/sensor" "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" - pc "github.com/argoproj/argo-events/pkg/common" "github.com/rs/zerolog" corev1 "k8s.io/api/core/v1" apierr "k8s.io/apimachinery/pkg/api/errors" diff --git a/controllers/sensor/state.go b/controllers/sensor/state.go index 63b2a6da7b..a82ed3de77 100644 --- a/controllers/sensor/state.go +++ b/controllers/sensor/state.go @@ -21,6 +21,7 @@ import ( "time" "github.com/argoproj/argo-events/common" + apicommon "github.com/argoproj/argo-events/pkg/apis/common" sclient "github.com/argoproj/argo-events/pkg/client/sensor/clientset/versioned" "github.com/rs/zerolog" "k8s.io/apimachinery/pkg/api/errors" @@ -106,7 +107,7 @@ func ReapplyUpdate(sensorClient sclient.Interface, sensor *v1alpha1.Sensor) erro } // MarkNodePhase marks the node with a phase, returns the node -func MarkNodePhase(sensor *v1alpha1.Sensor, nodeName string, nodeType v1alpha1.NodeType, phase v1alpha1.NodePhase, event *v1alpha1.Event, log *zerolog.Logger, message ...string) *v1alpha1.NodeStatus { +func MarkNodePhase(sensor *v1alpha1.Sensor, nodeName string, nodeType v1alpha1.NodeType, phase v1alpha1.NodePhase, event *apicommon.Event, log *zerolog.Logger, message ...string) *v1alpha1.NodeStatus { node := GetNodeByName(sensor, nodeName) if node.Phase != phase { log.Info().Str("type", string(node.Type)).Str("node-name", node.Name).Str("phase", string(node.Phase)) diff --git a/controllers/sensor/state_test.go b/controllers/sensor/state_test.go index c80ba37581..1a425cfad7 100644 --- a/controllers/sensor/state_test.go +++ b/controllers/sensor/state_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/argoproj/argo-events/common" + apicommon "github.com/argoproj/argo-events/pkg/apis/common" "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" fakesensor "github.com/argoproj/argo-events/pkg/client/sensor/clientset/versioned/fake" "github.com/smartystreets/goconvey/convey" @@ -39,7 +40,7 @@ func TestSensorState(t *testing.T) { }) convey.Convey("Mark sn node state to active", func() { - status := MarkNodePhase(sn, "first_node", v1alpha1.NodeTypeEventDependency, v1alpha1.NodePhaseActive, &v1alpha1.Event{ + status := MarkNodePhase(sn, "first_node", v1alpha1.NodeTypeEventDependency, v1alpha1.NodePhaseActive, &apicommon.Event{ Payload: []byte("test payload"), }, &logger) convey.So(status.Phase, convey.ShouldEqual, v1alpha1.NodePhaseActive) diff --git a/controllers/sensor/validate.go b/controllers/sensor/validate.go index f036d598f6..c0d1293ec5 100644 --- a/controllers/sensor/validate.go +++ b/controllers/sensor/validate.go @@ -21,8 +21,8 @@ import ( "time" "github.com/argoproj/argo-events/common" + pc "github.com/argoproj/argo-events/pkg/apis/common" "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" - pc "github.com/argoproj/argo-events/pkg/common" ) // ValidateSensor accepts a sensor and performs validation against it diff --git a/gateways/config.go b/gateways/config.go index 574b8c0bd1..aba7da66dd 100644 --- a/gateways/config.go +++ b/gateways/config.go @@ -24,9 +24,9 @@ import ( "github.com/nats-io/go-nats" "github.com/argoproj/argo-events/common" + pc "github.com/argoproj/argo-events/pkg/apis/common" "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1" gwclientset "github.com/argoproj/argo-events/pkg/client/gateway/clientset/versioned" - pc "github.com/argoproj/argo-events/pkg/common" snats "github.com/nats-io/go-nats-streaming" "github.com/rs/zerolog" "google.golang.org/grpc" diff --git a/gateways/core/artifact/config.go b/gateways/core/artifact/config.go index 463c834263..69f33715ba 100644 --- a/gateways/core/artifact/config.go +++ b/gateways/core/artifact/config.go @@ -17,10 +17,9 @@ limitations under the License. package artifact import ( + apicommon "github.com/argoproj/argo-events/pkg/apis/common" "github.com/ghodss/yaml" - "github.com/minio/minio-go" "github.com/rs/zerolog" - corev1 "k8s.io/api/core/v1" "k8s.io/client-go/kubernetes" ) @@ -33,47 +32,11 @@ type S3EventSourceExecutor struct { Namespace string } -// s3Artifact contains information about an artifact in S3 -// +k8s:openapi-gen=true -//proteus:generate -type s3Artifact struct { - // S3EventConfig contains configuration for bucket notification - S3EventConfig *S3EventConfig `json:"s3EventConfig"` - - // Mode of operation for s3 client - Insecure bool `json:"insecure,omitempty"` - - // AccessKey - // +k8s:openapi-gen=false - AccessKey *corev1.SecretKeySelector `json:"accessKey,omitempty"` - - // SecretKey - // +k8s:openapi-gen=false - SecretKey *corev1.SecretKeySelector `json:"secretKey,omitempty"` -} - -// S3EventConfig contains configuration for bucket notification -// +k8s:openapi-gen=true -type S3EventConfig struct { - Endpoint string `json:"endpoint,omitempty"` - Bucket string `json:"bucket,omitempty"` - Region string `json:"region,omitempty"` - Event minio.NotificationEventType `json:"event,omitempty"` - Filter S3Filter `json:"filter,omitempty"` -} - -// S3Filter represents filters to apply to bucket nofifications for specifying constraints on objects -// +k8s:openapi-gen=true -type S3Filter struct { - Prefix string `json:"prefix"` - Suffix string `json:"suffix"` -} - -func parseEventSource(config string) (*s3Artifact, error) { - var s *s3Artifact - err := yaml.Unmarshal([]byte(config), &s) +func parseEventSource(config string) (*apicommon.S3Artifact, error) { + var a *apicommon.S3Artifact + err := yaml.Unmarshal([]byte(config), &a) if err != nil { return nil, err } - return s, err + return a, err } diff --git a/gateways/core/artifact/start.go b/gateways/core/artifact/start.go index 3ff8cf04f2..8721d0ecec 100644 --- a/gateways/core/artifact/start.go +++ b/gateways/core/artifact/start.go @@ -18,16 +18,17 @@ package artifact import ( "encoding/json" - "github.com/argoproj/argo-events/store" "github.com/argoproj/argo-events/gateways" + apicommon "github.com/argoproj/argo-events/pkg/apis/common" + "github.com/argoproj/argo-events/store" "github.com/minio/minio-go" ) // StartEventSource activates an event source and streams back events func (ese *S3EventSourceExecutor) StartEventSource(eventSource *gateways.EventSource, eventStream gateways.Eventing_StartEventSourceServer) error { ese.Log.Info().Str("event-source-name", eventSource.Name).Msg("activating event source") - artifact, err := parseEventSource(eventSource.Data) + a, err := parseEventSource(eventSource.Data) if err != nil { return err } @@ -36,37 +37,37 @@ func (ese *S3EventSourceExecutor) StartEventSource(eventSource *gateways.EventSo errorCh := make(chan error) doneCh := make(chan struct{}, 1) - go ese.listenEvents(artifact, eventSource, dataCh, errorCh, doneCh) + go ese.listenEvents(a, eventSource, dataCh, errorCh, doneCh) return gateways.HandleEventsFromEventSource(eventSource.Name, eventStream, dataCh, errorCh, doneCh, &ese.Log) } // listenEvents listens to minio bucket notifications -func (ese *S3EventSourceExecutor) listenEvents(artifact *s3Artifact, eventSource *gateways.EventSource, dataCh chan []byte, errorCh chan error, doneCh chan struct{}) { +func (ese *S3EventSourceExecutor) listenEvents(a *apicommon.S3Artifact, eventSource *gateways.EventSource, dataCh chan []byte, errorCh chan error, doneCh chan struct{}) { defer gateways.Recover(eventSource.Name) ese.Log.Info().Str("event-source-name", eventSource.Name).Msg("retrieving access and secret key") // retrieve access key id and secret access key - accessKey, err := store.GetSecrets(ese.Clientset, ese.Namespace, artifact.AccessKey.Name, artifact.AccessKey.Key) + accessKey, err := store.GetSecrets(ese.Clientset, ese.Namespace, a.AccessKey.Name, a.SecretKey.Key) if err != nil { errorCh <- err return } - secretKey, err := store.GetSecrets(ese.Clientset, ese.Namespace, artifact.SecretKey.Name, artifact.SecretKey.Key) + secretKey, err := store.GetSecrets(ese.Clientset, ese.Namespace, a.SecretKey.Name, a.SecretKey.Key) if err != nil { errorCh <- err return } - minioClient, err := minio.New(artifact.S3EventConfig.Endpoint, accessKey, secretKey, !artifact.Insecure) + minioClient, err := minio.New(a.Endpoint, accessKey, secretKey, !a.Insecure) if err != nil { errorCh <- err return } ese.Log.Info().Str("event-source-name", eventSource.Name).Msg("starting to listen to bucket notifications") - for notification := range minioClient.ListenBucketNotification(artifact.S3EventConfig.Bucket, artifact.S3EventConfig.Filter.Prefix, artifact.S3EventConfig.Filter.Suffix, []string{ - string(artifact.S3EventConfig.Event), + for notification := range minioClient.ListenBucketNotification(a.Bucket.Name, a.Filter.Prefix, a.Filter.Suffix, []string{ + string(a.Event), }, doneCh) { if notification.Err != nil { errorCh <- notification.Err diff --git a/gateways/core/artifact/validate.go b/gateways/core/artifact/validate.go index 5423b42834..532df66b6e 100644 --- a/gateways/core/artifact/validate.go +++ b/gateways/core/artifact/validate.go @@ -19,6 +19,7 @@ package artifact import ( "context" "fmt" + apicommon "github.com/argoproj/argo-events/pkg/apis/common" "github.com/argoproj/argo-events/gateways" "github.com/minio/minio-go" @@ -27,12 +28,12 @@ import ( // ValidateEventSource validates a s3 event source func (ese *S3EventSourceExecutor) ValidateEventSource(ctx context.Context, eventSource *gateways.EventSource) (*gateways.ValidEventSource, error) { v := &gateways.ValidEventSource{} - artifact, err := parseEventSource(eventSource.Data) + a, err := parseEventSource(eventSource.Data) if err != nil { gateways.SetValidEventSource(v, fmt.Sprintf("%s. err: %s", gateways.ErrEventSourceParseFailed, err.Error()), false) return v, nil } - if err = validateArtifact(artifact); err != nil { + if err = validateArtifact(a); err != nil { gateways.SetValidEventSource(v, err.Error(), false) return v, gateways.ErrInvalidEventSource } @@ -41,27 +42,24 @@ func (ese *S3EventSourceExecutor) ValidateEventSource(ctx context.Context, event } // validates an artifact -func validateArtifact(artifact *s3Artifact) error { - if artifact == nil { +func validateArtifact(a *apicommon.S3Artifact) error { + if a == nil { return gateways.ErrEmptyEventSource } - if artifact.S3EventConfig == nil { - return fmt.Errorf("s3 bucket configuration can't be empty") - } - if artifact.AccessKey == nil { + if a.AccessKey == nil { return fmt.Errorf("access key can't be empty") } - if artifact.SecretKey == nil { + if a.SecretKey == nil { return fmt.Errorf("secret key can't be empty") } - if artifact.S3EventConfig.Endpoint == "" { + if a.Endpoint == "" { return fmt.Errorf("endpoint url can't be empty") } - if artifact.S3EventConfig.Bucket == "" { + if a.Bucket != nil && a.Bucket.Name == "" { return fmt.Errorf("bucket name can't be empty") } - if artifact.S3EventConfig.Event != "" && minio.NotificationEventType(artifact.S3EventConfig.Event) == "" { - return fmt.Errorf("unknown event %s", artifact.S3EventConfig.Event) + if a.Event != "" && minio.NotificationEventType(a.Event) == "" { + return fmt.Errorf("unknown event %s", a.Event) } return nil } diff --git a/gateways/core/artifact/validate_test.go b/gateways/core/artifact/validate_test.go index 68f67c1cb3..d37684c847 100644 --- a/gateways/core/artifact/validate_test.go +++ b/gateways/core/artifact/validate_test.go @@ -28,11 +28,11 @@ var ( configKey = "testConfig" configId = "1234" configValue = ` -s3EventConfig: - bucket: input - endpoint: minio-service.argo-events:9000 - event: s3:ObjectCreated:Put - filter: +bucket: + name: input +endpoint: minio-service.argo-events:9000 +event: s3:ObjectCreated:Put +filter: prefix: "" suffix: "" insecure: true diff --git a/gateways/event-source_test.go b/gateways/event-source_test.go index 24fbbb57fa..810807f08a 100644 --- a/gateways/event-source_test.go +++ b/gateways/event-source_test.go @@ -53,7 +53,7 @@ func (ese *testEventSourceExecutor) ValidateEventSource(ctx context.Context, eve } func TestEventSources(t *testing.T) { - os.Setenv(common.EnvVarGatewayServerPort, "1234") + _ = os.Setenv(common.EnvVarGatewayServerPort, "1234") go StartGateway(&testEventSourceExecutor{}) gc := getGatewayConfig() diff --git a/gateways/transformer.go b/gateways/transformer.go index 2c06bf97da..f52bc4cb9a 100644 --- a/gateways/transformer.go +++ b/gateways/transformer.go @@ -24,8 +24,8 @@ import ( "time" "github.com/argoproj/argo-events/common" - sv1alpha "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" - pc "github.com/argoproj/argo-events/pkg/common" + apicommon "github.com/argoproj/argo-events/pkg/apis/common" + pc "github.com/argoproj/argo-events/pkg/apis/common" suuid "github.com/satori/go.uuid" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -67,7 +67,7 @@ func (gc *GatewayConfig) DispatchEvent(gatewayEvent *Event) error { // transformEvent transforms an event from event source into a CloudEvents specification compliant event // See https://github.com/cloudevents/spec for more info. -func (gc *GatewayConfig) transformEvent(gatewayEvent *Event) (*sv1alpha.Event, error) { +func (gc *GatewayConfig) transformEvent(gatewayEvent *Event) (*apicommon.Event, error) { // Generate an event id eventId := suuid.NewV1() @@ -75,15 +75,15 @@ func (gc *GatewayConfig) transformEvent(gatewayEvent *Event) (*sv1alpha.Event, e Msg("converting gateway event into cloudevents specification compliant event") // Create an CloudEvent - ce := &sv1alpha.Event{ - Context: sv1alpha.EventContext{ + ce := &apicommon.Event{ + Context: apicommon.EventContext{ CloudEventsVersion: common.CloudEventsVersion, EventID: fmt.Sprintf("%x", eventId), ContentType: "application/json", EventTime: metav1.MicroTime{Time: time.Now().UTC()}, EventType: gc.gw.Spec.Type, EventTypeVersion: gc.gw.Spec.EventVersion, - Source: &sv1alpha.URI{ + Source: &apicommon.URI{ Host: common.DefaultGatewayConfigurationName(gc.gw.Name, gatewayEvent.Name), }, }, diff --git a/pkg/apis/common/deepcopy_generated.go b/pkg/apis/common/deepcopy_generated.go new file mode 100644 index 0000000000..057cbf6964 --- /dev/null +++ b/pkg/apis/common/deepcopy_generated.go @@ -0,0 +1,165 @@ +// +build !ignore_autogenerated + +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by main. DO NOT EDIT. + +package common + +import ( + v1 "k8s.io/api/core/v1" +) + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Event) DeepCopyInto(out *Event) { + *out = *in + in.Context.DeepCopyInto(&out.Context) + if in.Payload != nil { + in, out := &in.Payload, &out.Payload + *out = make([]byte, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Event. +func (in *Event) DeepCopy() *Event { + if in == nil { + return nil + } + out := new(Event) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EventContext) DeepCopyInto(out *EventContext) { + *out = *in + if in.Source != nil { + in, out := &in.Source, &out.Source + *out = new(URI) + **out = **in + } + in.EventTime.DeepCopyInto(&out.EventTime) + if in.SchemaURL != nil { + in, out := &in.SchemaURL, &out.SchemaURL + *out = new(URI) + **out = **in + } + if in.Extensions != nil { + in, out := &in.Extensions, &out.Extensions + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EventContext. +func (in *EventContext) DeepCopy() *EventContext { + if in == nil { + return nil + } + out := new(EventContext) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *S3Artifact) DeepCopyInto(out *S3Artifact) { + *out = *in + if in.Bucket != nil { + in, out := &in.Bucket, &out.Bucket + *out = new(S3Bucket) + **out = **in + } + if in.AccessKey != nil { + in, out := &in.AccessKey, &out.AccessKey + *out = new(v1.SecretKeySelector) + (*in).DeepCopyInto(*out) + } + if in.SecretKey != nil { + in, out := &in.SecretKey, &out.SecretKey + *out = new(v1.SecretKeySelector) + (*in).DeepCopyInto(*out) + } + if in.Filter != nil { + in, out := &in.Filter, &out.Filter + *out = new(S3Filter) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new S3Artifact. +func (in *S3Artifact) DeepCopy() *S3Artifact { + if in == nil { + return nil + } + out := new(S3Artifact) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *S3Bucket) DeepCopyInto(out *S3Bucket) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new S3Bucket. +func (in *S3Bucket) DeepCopy() *S3Bucket { + if in == nil { + return nil + } + out := new(S3Bucket) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *S3Filter) DeepCopyInto(out *S3Filter) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new S3Filter. +func (in *S3Filter) DeepCopy() *S3Filter { + if in == nil { + return nil + } + out := new(S3Filter) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *URI) DeepCopyInto(out *URI) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new URI. +func (in *URI) DeepCopy() *URI { + if in == nil { + return nil + } + out := new(URI) + in.DeepCopyInto(out) + return out +} diff --git a/pkg/apis/common/doc.go b/pkg/apis/common/doc.go new file mode 100644 index 0000000000..6a3cf43108 --- /dev/null +++ b/pkg/apis/common/doc.go @@ -0,0 +1,2 @@ +// +k8s:deepcopy-gen=package +package common diff --git a/pkg/apis/common/event.go b/pkg/apis/common/event.go new file mode 100644 index 0000000000..3e90a1a15a --- /dev/null +++ b/pkg/apis/common/event.go @@ -0,0 +1,99 @@ +/* +Copyright 2018 BlackRock, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package common + +import "k8s.io/apimachinery/pkg/apis/meta/v1" + +// EventProtocolType is type of the event dispatch protocol. Used for dispatching events +type EventProtocolType string + +// possible types of event dispatch protocol +const ( + HTTP EventProtocolType = "HTTP" + NATS EventProtocolType = "NATS" +) + +// Type of nats connection. +type NatsType string + +// possible values of nats connection type +const ( + Standard NatsType = "Standard" + Streaming NatsType = "Streaming" +) + +// Event is a data record expressing an occurrence and its context. +// Adheres to the CloudEvents v0.1 specification +type Event struct { + Context EventContext `json:"context" protobuf:"bytes,1,opt,name=context"` + Payload []byte `json:"payload" protobuf:"bytes,2,opt,name=data"` +} + +// EventContext contains metadata that provides circumstantial information about the occurrence. +type EventContext struct { + // The type of occurrence which has happened. Often this attribute is used for + // routing, observability, policy enforcement, etc. + // should be prefixed with a reverse-DNS name. The prefixed domain dictates + // the organization which defines the semantics of this event type. ex: com.github.pull.create + EventType string `json:"eventType" protobuf:"bytes,1,opt,name=eventType"` + + // The version of the eventType. Enables the interpretation of data by eventual consumers, + // requires the consumer to be knowledgeable about the producer. + EventTypeVersion string `json:"eventTypeVersion" protobuf:"bytes,2,opt,name=eventTypeVersion"` + + // The version of the CloudEvents specification which the event uses. + // Enables the interpretation of the context. + CloudEventsVersion string `json:"cloudEventsVersion" protobuf:"bytes,3,opt,name=cloudEventsVersion"` + + // This describes the event producer. + Source *URI `json:"source" protobuf:"bytes,4,opt,name=source"` + + // ID of the event. The semantics are explicitly undefined to ease the implementation of producers. + // Enables deduplication. Must be unique within scope of producer. + EventID string `json:"eventID" protobuf:"bytes,5,opt,name=eventID"` + + // Timestamp of when the event happened. Must adhere to format specified in RFC 3339. + + EventTime v1.MicroTime `json:"eventTime" protobuf:"bytes,6,opt,name=eventTime"` + + // A link to the schema that the data attribute adheres to. + // Must adhere to the format specified in RFC 3986. + SchemaURL *URI `json:"schemaURL" protobuf:"bytes,7,opt,name=schemaURL"` + + // Content type of the data attribute value. Enables the data attribute to carry any type of content, + // whereby format and encoding might differ from that of the chosen event format. + // For example, the data attribute may carry an XML or JSON payload and the consumer is informed + // by this attribute being set to "application/xml" or "application/json" respectively. + ContentType string `json:"contentType" protobuf:"bytes,8,opt,name=contentType"` + + // This is for additional metadata and does not have a mandated structure. + // Enables a place for custom fields a producer or middleware might want to include and provides a place + // to test metadata before adding them to the CloudEvents specification. + Extensions map[string]string `json:"extensions,omitempty" protobuf:"bytes,9,rep,name=extensions"` +} + +// URI is a Uniform Resource Identifier based on RFC 3986 +type URI struct { + Scheme string `json:"scheme" protobuf:"bytes,1,opt,name=scheme"` + User string `json:"user" protobuf:"bytes,2,opt,name=user"` + Password string `json:"password" protobuf:"bytes,3,opt,name=password"` + Host string `json:"host" protobuf:"bytes,4,opt,name=host"` + Port int32 `json:"port" protobuf:"bytes,5,opt,name=port"` + Path string `json:"path" protobuf:"bytes,6,opt,name=path"` + Query string `json:"query" protobuf:"bytes,7,opt,name=query"` + Fragment string `json:"fragment" protobuf:"bytes,8,opt,name=fragment"` +} diff --git a/pkg/apis/common/generated.pb.go b/pkg/apis/common/generated.pb.go new file mode 100644 index 0000000000..81e941da23 --- /dev/null +++ b/pkg/apis/common/generated.pb.go @@ -0,0 +1,2253 @@ +/* +Copyright 2018 BlackRock, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ // Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: github.com/argoproj/argo-events/pkg/apis/common/generated.proto + +package common + +import proto "github.com/gogo/protobuf/proto" +import fmt "fmt" +import math "math" + +import v11 "k8s.io/api/core/v1" + +import github_com_minio_minio_go "github.com/minio/minio-go" + +import github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys" + +import strings "strings" +import reflect "reflect" + +import io "io" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package + +func (m *Event) Reset() { *m = Event{} } +func (*Event) ProtoMessage() {} +func (*Event) Descriptor() ([]byte, []int) { + return fileDescriptor_generated_add59c9e28fc7b12, []int{0} +} +func (m *Event) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Event) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (dst *Event) XXX_Merge(src proto.Message) { + xxx_messageInfo_Event.Merge(dst, src) +} +func (m *Event) XXX_Size() int { + return m.Size() +} +func (m *Event) XXX_DiscardUnknown() { + xxx_messageInfo_Event.DiscardUnknown(m) +} + +var xxx_messageInfo_Event proto.InternalMessageInfo + +func (m *EventContext) Reset() { *m = EventContext{} } +func (*EventContext) ProtoMessage() {} +func (*EventContext) Descriptor() ([]byte, []int) { + return fileDescriptor_generated_add59c9e28fc7b12, []int{1} +} +func (m *EventContext) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EventContext) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (dst *EventContext) XXX_Merge(src proto.Message) { + xxx_messageInfo_EventContext.Merge(dst, src) +} +func (m *EventContext) XXX_Size() int { + return m.Size() +} +func (m *EventContext) XXX_DiscardUnknown() { + xxx_messageInfo_EventContext.DiscardUnknown(m) +} + +var xxx_messageInfo_EventContext proto.InternalMessageInfo + +func (m *S3Artifact) Reset() { *m = S3Artifact{} } +func (*S3Artifact) ProtoMessage() {} +func (*S3Artifact) Descriptor() ([]byte, []int) { + return fileDescriptor_generated_add59c9e28fc7b12, []int{2} +} +func (m *S3Artifact) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *S3Artifact) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (dst *S3Artifact) XXX_Merge(src proto.Message) { + xxx_messageInfo_S3Artifact.Merge(dst, src) +} +func (m *S3Artifact) XXX_Size() int { + return m.Size() +} +func (m *S3Artifact) XXX_DiscardUnknown() { + xxx_messageInfo_S3Artifact.DiscardUnknown(m) +} + +var xxx_messageInfo_S3Artifact proto.InternalMessageInfo + +func (m *S3Bucket) Reset() { *m = S3Bucket{} } +func (*S3Bucket) ProtoMessage() {} +func (*S3Bucket) Descriptor() ([]byte, []int) { + return fileDescriptor_generated_add59c9e28fc7b12, []int{3} +} +func (m *S3Bucket) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *S3Bucket) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (dst *S3Bucket) XXX_Merge(src proto.Message) { + xxx_messageInfo_S3Bucket.Merge(dst, src) +} +func (m *S3Bucket) XXX_Size() int { + return m.Size() +} +func (m *S3Bucket) XXX_DiscardUnknown() { + xxx_messageInfo_S3Bucket.DiscardUnknown(m) +} + +var xxx_messageInfo_S3Bucket proto.InternalMessageInfo + +func (m *S3Filter) Reset() { *m = S3Filter{} } +func (*S3Filter) ProtoMessage() {} +func (*S3Filter) Descriptor() ([]byte, []int) { + return fileDescriptor_generated_add59c9e28fc7b12, []int{4} +} +func (m *S3Filter) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *S3Filter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (dst *S3Filter) XXX_Merge(src proto.Message) { + xxx_messageInfo_S3Filter.Merge(dst, src) +} +func (m *S3Filter) XXX_Size() int { + return m.Size() +} +func (m *S3Filter) XXX_DiscardUnknown() { + xxx_messageInfo_S3Filter.DiscardUnknown(m) +} + +var xxx_messageInfo_S3Filter proto.InternalMessageInfo + +func (m *URI) Reset() { *m = URI{} } +func (*URI) ProtoMessage() {} +func (*URI) Descriptor() ([]byte, []int) { + return fileDescriptor_generated_add59c9e28fc7b12, []int{5} +} +func (m *URI) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *URI) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (dst *URI) XXX_Merge(src proto.Message) { + xxx_messageInfo_URI.Merge(dst, src) +} +func (m *URI) XXX_Size() int { + return m.Size() +} +func (m *URI) XXX_DiscardUnknown() { + xxx_messageInfo_URI.DiscardUnknown(m) +} + +var xxx_messageInfo_URI proto.InternalMessageInfo + +func init() { + proto.RegisterType((*Event)(nil), "github.com.argoproj.argo_events.pkg.apis.common.Event") + proto.RegisterType((*EventContext)(nil), "github.com.argoproj.argo_events.pkg.apis.common.EventContext") + proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_events.pkg.apis.common.EventContext.ExtensionsEntry") + proto.RegisterType((*S3Artifact)(nil), "github.com.argoproj.argo_events.pkg.apis.common.S3Artifact") + proto.RegisterType((*S3Bucket)(nil), "github.com.argoproj.argo_events.pkg.apis.common.S3Bucket") + proto.RegisterType((*S3Filter)(nil), "github.com.argoproj.argo_events.pkg.apis.common.S3Filter") + proto.RegisterType((*URI)(nil), "github.com.argoproj.argo_events.pkg.apis.common.URI") +} +func (m *Event) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Event) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Context.Size())) + n1, err := m.Context.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n1 + if m.Payload != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Payload))) + i += copy(dAtA[i:], m.Payload) + } + return i, nil +} + +func (m *EventContext) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EventContext) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.EventType))) + i += copy(dAtA[i:], m.EventType) + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.EventTypeVersion))) + i += copy(dAtA[i:], m.EventTypeVersion) + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.CloudEventsVersion))) + i += copy(dAtA[i:], m.CloudEventsVersion) + if m.Source != nil { + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Source.Size())) + n2, err := m.Source.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n2 + } + dAtA[i] = 0x2a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.EventID))) + i += copy(dAtA[i:], m.EventID) + dAtA[i] = 0x32 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.EventTime.Size())) + n3, err := m.EventTime.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n3 + if m.SchemaURL != nil { + dAtA[i] = 0x3a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.SchemaURL.Size())) + n4, err := m.SchemaURL.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n4 + } + dAtA[i] = 0x42 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ContentType))) + i += copy(dAtA[i:], m.ContentType) + if len(m.Extensions) > 0 { + keysForExtensions := make([]string, 0, len(m.Extensions)) + for k := range m.Extensions { + keysForExtensions = append(keysForExtensions, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForExtensions) + for _, k := range keysForExtensions { + dAtA[i] = 0x4a + i++ + v := m.Extensions[string(k)] + mapSize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + len(v) + sovGenerated(uint64(len(v))) + i = encodeVarintGenerated(dAtA, i, uint64(mapSize)) + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(k))) + i += copy(dAtA[i:], k) + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(v))) + i += copy(dAtA[i:], v) + } + } + return i, nil +} + +func (m *S3Artifact) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *S3Artifact) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Endpoint))) + i += copy(dAtA[i:], m.Endpoint) + if m.Bucket != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Bucket.Size())) + n5, err := m.Bucket.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n5 + } + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Region))) + i += copy(dAtA[i:], m.Region) + dAtA[i] = 0x20 + i++ + if m.Insecure { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + if m.AccessKey != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.AccessKey.Size())) + n6, err := m.AccessKey.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n6 + } + if m.SecretKey != nil { + dAtA[i] = 0x32 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.SecretKey.Size())) + n7, err := m.SecretKey.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n7 + } + dAtA[i] = 0x3a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Event))) + i += copy(dAtA[i:], m.Event) + if m.Filter != nil { + dAtA[i] = 0x42 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Filter.Size())) + n8, err := m.Filter.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n8 + } + return i, nil +} + +func (m *S3Bucket) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *S3Bucket) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Key))) + i += copy(dAtA[i:], m.Key) + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + return i, nil +} + +func (m *S3Filter) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *S3Filter) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Prefix))) + i += copy(dAtA[i:], m.Prefix) + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Suffix))) + i += copy(dAtA[i:], m.Suffix) + return i, nil +} + +func (m *URI) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *URI) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Scheme))) + i += copy(dAtA[i:], m.Scheme) + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.User))) + i += copy(dAtA[i:], m.User) + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Password))) + i += copy(dAtA[i:], m.Password) + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Host))) + i += copy(dAtA[i:], m.Host) + dAtA[i] = 0x28 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Port)) + dAtA[i] = 0x32 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Path))) + i += copy(dAtA[i:], m.Path) + dAtA[i] = 0x3a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Query))) + i += copy(dAtA[i:], m.Query) + dAtA[i] = 0x42 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Fragment))) + i += copy(dAtA[i:], m.Fragment) + return i, nil +} + +func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return offset + 1 +} +func (m *Event) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Context.Size() + n += 1 + l + sovGenerated(uint64(l)) + if m.Payload != nil { + l = len(m.Payload) + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *EventContext) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.EventType) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.EventTypeVersion) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.CloudEventsVersion) + n += 1 + l + sovGenerated(uint64(l)) + if m.Source != nil { + l = m.Source.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + l = len(m.EventID) + n += 1 + l + sovGenerated(uint64(l)) + l = m.EventTime.Size() + n += 1 + l + sovGenerated(uint64(l)) + if m.SchemaURL != nil { + l = m.SchemaURL.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + l = len(m.ContentType) + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Extensions) > 0 { + for k, v := range m.Extensions { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + len(v) + sovGenerated(uint64(len(v))) + n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) + } + } + return n +} + +func (m *S3Artifact) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Endpoint) + n += 1 + l + sovGenerated(uint64(l)) + if m.Bucket != nil { + l = m.Bucket.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + l = len(m.Region) + n += 1 + l + sovGenerated(uint64(l)) + n += 2 + if m.AccessKey != nil { + l = m.AccessKey.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.SecretKey != nil { + l = m.SecretKey.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + l = len(m.Event) + n += 1 + l + sovGenerated(uint64(l)) + if m.Filter != nil { + l = m.Filter.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + +func (m *S3Bucket) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *S3Filter) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Prefix) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Suffix) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *URI) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Scheme) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.User) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Password) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Host) + n += 1 + l + sovGenerated(uint64(l)) + n += 1 + sovGenerated(uint64(m.Port)) + l = len(m.Path) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Query) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Fragment) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func sovGenerated(x uint64) (n int) { + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} +func sozGenerated(x uint64) (n int) { + return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (this *Event) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Event{`, + `Context:` + strings.Replace(strings.Replace(this.Context.String(), "EventContext", "EventContext", 1), `&`, ``, 1) + `,`, + `Payload:` + valueToStringGenerated(this.Payload) + `,`, + `}`, + }, "") + return s +} +func (this *EventContext) String() string { + if this == nil { + return "nil" + } + keysForExtensions := make([]string, 0, len(this.Extensions)) + for k := range this.Extensions { + keysForExtensions = append(keysForExtensions, k) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForExtensions) + mapStringForExtensions := "map[string]string{" + for _, k := range keysForExtensions { + mapStringForExtensions += fmt.Sprintf("%v: %v,", k, this.Extensions[k]) + } + mapStringForExtensions += "}" + s := strings.Join([]string{`&EventContext{`, + `EventType:` + fmt.Sprintf("%v", this.EventType) + `,`, + `EventTypeVersion:` + fmt.Sprintf("%v", this.EventTypeVersion) + `,`, + `CloudEventsVersion:` + fmt.Sprintf("%v", this.CloudEventsVersion) + `,`, + `Source:` + strings.Replace(fmt.Sprintf("%v", this.Source), "URI", "URI", 1) + `,`, + `EventID:` + fmt.Sprintf("%v", this.EventID) + `,`, + `EventTime:` + strings.Replace(strings.Replace(this.EventTime.String(), "MicroTime", "v1.MicroTime", 1), `&`, ``, 1) + `,`, + `SchemaURL:` + strings.Replace(fmt.Sprintf("%v", this.SchemaURL), "URI", "URI", 1) + `,`, + `ContentType:` + fmt.Sprintf("%v", this.ContentType) + `,`, + `Extensions:` + mapStringForExtensions + `,`, + `}`, + }, "") + return s +} +func (this *S3Artifact) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&S3Artifact{`, + `Endpoint:` + fmt.Sprintf("%v", this.Endpoint) + `,`, + `Bucket:` + strings.Replace(fmt.Sprintf("%v", this.Bucket), "S3Bucket", "S3Bucket", 1) + `,`, + `Region:` + fmt.Sprintf("%v", this.Region) + `,`, + `Insecure:` + fmt.Sprintf("%v", this.Insecure) + `,`, + `AccessKey:` + strings.Replace(fmt.Sprintf("%v", this.AccessKey), "SecretKeySelector", "v11.SecretKeySelector", 1) + `,`, + `SecretKey:` + strings.Replace(fmt.Sprintf("%v", this.SecretKey), "SecretKeySelector", "v11.SecretKeySelector", 1) + `,`, + `Event:` + fmt.Sprintf("%v", this.Event) + `,`, + `Filter:` + strings.Replace(fmt.Sprintf("%v", this.Filter), "S3Filter", "S3Filter", 1) + `,`, + `}`, + }, "") + return s +} +func (this *S3Bucket) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&S3Bucket{`, + `Key:` + fmt.Sprintf("%v", this.Key) + `,`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `}`, + }, "") + return s +} +func (this *S3Filter) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&S3Filter{`, + `Prefix:` + fmt.Sprintf("%v", this.Prefix) + `,`, + `Suffix:` + fmt.Sprintf("%v", this.Suffix) + `,`, + `}`, + }, "") + return s +} +func (this *URI) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&URI{`, + `Scheme:` + fmt.Sprintf("%v", this.Scheme) + `,`, + `User:` + fmt.Sprintf("%v", this.User) + `,`, + `Password:` + fmt.Sprintf("%v", this.Password) + `,`, + `Host:` + fmt.Sprintf("%v", this.Host) + `,`, + `Port:` + fmt.Sprintf("%v", this.Port) + `,`, + `Path:` + fmt.Sprintf("%v", this.Path) + `,`, + `Query:` + fmt.Sprintf("%v", this.Query) + `,`, + `Fragment:` + fmt.Sprintf("%v", this.Fragment) + `,`, + `}`, + }, "") + return s +} +func valueToStringGenerated(v interface{}) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("*%v", pv) +} +func (m *Event) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Event: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Event: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Context", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Context.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Payload", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + byteLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Payload = append(m.Payload[:0], dAtA[iNdEx:postIndex]...) + if m.Payload == nil { + m.Payload = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EventContext) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EventContext: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EventContext: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EventType", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.EventType = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EventTypeVersion", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.EventTypeVersion = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CloudEventsVersion", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CloudEventsVersion = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Source", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Source == nil { + m.Source = &URI{} + } + if err := m.Source.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EventID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.EventID = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EventTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.EventTime.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SchemaURL", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.SchemaURL == nil { + m.SchemaURL = &URI{} + } + if err := m.SchemaURL.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ContentType", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ContentType = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Extensions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Extensions == nil { + m.Extensions = make(map[string]string) + } + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var stringLenmapvalue uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapvalue |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Extensions[mapkey] = mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *S3Artifact) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: S3Artifact: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: S3Artifact: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Endpoint", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Endpoint = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Bucket", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Bucket == nil { + m.Bucket = &S3Bucket{} + } + if err := m.Bucket.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Region", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Region = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Insecure", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Insecure = bool(v != 0) + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AccessKey", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.AccessKey == nil { + m.AccessKey = &v11.SecretKeySelector{} + } + if err := m.AccessKey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SecretKey", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.SecretKey == nil { + m.SecretKey = &v11.SecretKeySelector{} + } + if err := m.SecretKey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Event", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Event = github_com_minio_minio_go.NotificationEventType(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Filter", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Filter == nil { + m.Filter = &S3Filter{} + } + if err := m.Filter.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *S3Bucket) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: S3Bucket: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: S3Bucket: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *S3Filter) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: S3Filter: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: S3Filter: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Prefix", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Prefix = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Suffix", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Suffix = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *URI) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: URI: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: URI: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Scheme", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Scheme = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field User", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.User = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Password", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Password = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Host", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Host = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Port", wireType) + } + m.Port = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Port |= (int32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Path = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Query", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Query = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Fragment", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Fragment = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipGenerated(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + return iNdEx, nil + case 1: + iNdEx += 8 + return iNdEx, nil + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + iNdEx += length + if length < 0 { + return 0, ErrInvalidLengthGenerated + } + return iNdEx, nil + case 3: + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + innerWire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + innerWireType := int(innerWire & 0x7) + if innerWireType == 4 { + break + } + next, err := skipGenerated(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + } + return iNdEx, nil + case 4: + return iNdEx, nil + case 5: + iNdEx += 4 + return iNdEx, nil + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + } + panic("unreachable") +} + +var ( + ErrInvalidLengthGenerated = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowGenerated = fmt.Errorf("proto: integer overflow") +) + +func init() { + proto.RegisterFile("github.com/argoproj/argo-events/pkg/apis/common/generated.proto", fileDescriptor_generated_add59c9e28fc7b12) +} + +var fileDescriptor_generated_add59c9e28fc7b12 = []byte{ + // 1012 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x95, 0xdf, 0x6e, 0x1b, 0x45, + 0x14, 0xc6, 0xb3, 0x49, 0xec, 0xd8, 0xe3, 0x96, 0x86, 0x81, 0x0b, 0x2b, 0x12, 0x4e, 0x64, 0x04, + 0x0a, 0x52, 0xb3, 0xab, 0x26, 0x45, 0x2a, 0x48, 0x15, 0x74, 0x53, 0x57, 0x84, 0xd0, 0x2a, 0x8c, + 0x49, 0x85, 0x2a, 0x21, 0x98, 0xac, 0xc7, 0xf6, 0x60, 0xef, 0xce, 0x32, 0x33, 0x1b, 0xe2, 0x3b, + 0x78, 0x03, 0x84, 0xc4, 0xab, 0xf0, 0x0c, 0xb9, 0x42, 0xbd, 0xec, 0x55, 0x44, 0xcc, 0x5b, 0x70, + 0x85, 0xe6, 0xcc, 0xec, 0x9f, 0x3a, 0xed, 0x45, 0xe8, 0x4d, 0x32, 0x7b, 0xce, 0x77, 0x7e, 0x73, + 0xe6, 0xec, 0xb7, 0x63, 0xf4, 0xd9, 0x88, 0xeb, 0x71, 0x76, 0xe2, 0x47, 0x22, 0x0e, 0xa8, 0x1c, + 0x89, 0x54, 0x8a, 0x1f, 0x61, 0xb1, 0xc3, 0x4e, 0x59, 0xa2, 0x55, 0x90, 0x4e, 0x46, 0x01, 0x4d, + 0xb9, 0x0a, 0x22, 0x11, 0xc7, 0x22, 0x09, 0x46, 0x2c, 0x61, 0x92, 0x6a, 0x36, 0xf0, 0x53, 0x29, + 0xb4, 0xc0, 0x41, 0x09, 0xf0, 0x73, 0x00, 0x2c, 0xbe, 0xb7, 0x00, 0x3f, 0x9d, 0x8c, 0x7c, 0x03, + 0xf0, 0x2d, 0x60, 0x63, 0xa7, 0xb2, 0xe3, 0x48, 0x8c, 0x44, 0x00, 0x9c, 0x93, 0x6c, 0x08, 0x4f, + 0xf0, 0x00, 0x2b, 0xcb, 0xdf, 0xe8, 0x4e, 0xee, 0x29, 0x9f, 0x0b, 0xd3, 0x43, 0x10, 0x09, 0xc9, + 0x82, 0xd3, 0x3b, 0x8b, 0x3d, 0x6c, 0xdc, 0x2d, 0x35, 0x31, 0x8d, 0xc6, 0x3c, 0x61, 0x72, 0x56, + 0x36, 0x1e, 0x33, 0x4d, 0x5f, 0x55, 0x15, 0xbc, 0xae, 0x4a, 0x66, 0x89, 0xe6, 0x31, 0xbb, 0x52, + 0xb0, 0xf7, 0xba, 0x82, 0x4c, 0xf3, 0x69, 0xc0, 0x13, 0xad, 0xb4, 0x5c, 0x2c, 0xea, 0xfe, 0xee, + 0xa1, 0x5a, 0xcf, 0x4c, 0x02, 0x8f, 0xd1, 0x5a, 0x24, 0x12, 0xcd, 0xce, 0x74, 0xdb, 0xdb, 0xf2, + 0xb6, 0x5b, 0xbb, 0xf7, 0xfd, 0x6b, 0xce, 0xce, 0x07, 0xd0, 0xbe, 0x85, 0x84, 0xb7, 0xce, 0x2f, + 0x36, 0x97, 0xe6, 0x17, 0x9b, 0x6b, 0x2e, 0x40, 0x72, 0x3c, 0xde, 0x44, 0xab, 0x03, 0xaa, 0x69, + 0x7b, 0x79, 0xcb, 0xdb, 0xbe, 0x11, 0xb6, 0x8c, 0xe6, 0x88, 0xce, 0xa6, 0x82, 0x0e, 0x08, 0x24, + 0xba, 0x7f, 0xd4, 0xd1, 0x8d, 0x2a, 0x0b, 0x07, 0xa8, 0x09, 0x5b, 0x7e, 0x33, 0x4b, 0x19, 0x74, + 0xd7, 0x0c, 0xdf, 0x76, 0xf8, 0x66, 0x2f, 0x4f, 0x90, 0x52, 0x83, 0x1f, 0xa2, 0xf5, 0xe2, 0xe1, + 0x29, 0x93, 0x8a, 0x8b, 0x04, 0xb6, 0x6b, 0x86, 0x6d, 0x57, 0xb7, 0xde, 0x5b, 0xc8, 0x93, 0x2b, + 0x15, 0xf8, 0x4b, 0x84, 0xa3, 0xa9, 0xc8, 0x06, 0x20, 0x55, 0x39, 0x67, 0x05, 0x38, 0x1b, 0x8e, + 0x83, 0xf7, 0xaf, 0x28, 0xc8, 0x2b, 0xaa, 0xf0, 0xb7, 0xa8, 0xae, 0x44, 0x26, 0x23, 0xd6, 0x5e, + 0x85, 0xe9, 0xde, 0xbd, 0xf6, 0x74, 0x8f, 0xc9, 0x41, 0x88, 0xe6, 0x17, 0x9b, 0xf5, 0x3e, 0x70, + 0x88, 0xe3, 0xe1, 0x8f, 0xd0, 0x1a, 0x54, 0x1c, 0x3c, 0x6c, 0xd7, 0xa0, 0xb5, 0x62, 0xf2, 0x3d, + 0x1b, 0x26, 0x79, 0x1e, 0xff, 0x90, 0xcf, 0x91, 0xc7, 0xac, 0x5d, 0x87, 0x3e, 0x02, 0xdf, 0xda, + 0xc6, 0xaf, 0xda, 0xa6, 0xdc, 0xdb, 0xb8, 0xd3, 0x3f, 0xbd, 0xe3, 0x3f, 0xe6, 0x91, 0x14, 0xa6, + 0x6c, 0x71, 0xf0, 0x3c, 0x2e, 0x06, 0xcf, 0x63, 0x86, 0x29, 0x6a, 0xaa, 0x68, 0xcc, 0x62, 0x7a, + 0x4c, 0xbe, 0x6a, 0xaf, 0xbd, 0xc1, 0x49, 0x6f, 0x9a, 0x2d, 0xfa, 0x39, 0x8a, 0x94, 0x54, 0xfc, + 0x31, 0x6a, 0x81, 0x93, 0x9c, 0x1d, 0x1a, 0x70, 0xe6, 0x77, 0x5c, 0x57, 0xad, 0xfd, 0x32, 0x45, + 0xaa, 0x3a, 0xfc, 0xab, 0x87, 0x10, 0x3b, 0xd3, 0x2c, 0x31, 0xaf, 0x43, 0xb5, 0x9b, 0x5b, 0x2b, + 0xdb, 0xad, 0xdd, 0xc7, 0x6f, 0xe4, 0x71, 0xbf, 0x57, 0xf0, 0x7a, 0x89, 0x96, 0xb3, 0x10, 0xbb, + 0x2e, 0x50, 0x99, 0x20, 0x95, 0x4d, 0x37, 0xee, 0xa3, 0x5b, 0x0b, 0x25, 0x78, 0x1d, 0xad, 0x4c, + 0xd8, 0xcc, 0x9a, 0x9a, 0x98, 0x25, 0x7e, 0x17, 0xd5, 0x4e, 0xe9, 0x34, 0x63, 0xd6, 0xb0, 0xc4, + 0x3e, 0x7c, 0xba, 0x7c, 0xcf, 0xeb, 0xfe, 0xb5, 0x8a, 0x50, 0x7f, 0xef, 0x81, 0xd4, 0x7c, 0x48, + 0x23, 0x8d, 0x6f, 0xa3, 0x06, 0x4b, 0x06, 0xa9, 0xe0, 0x89, 0x76, 0x1f, 0xc5, 0xba, 0xdb, 0xbf, + 0xd1, 0x73, 0x71, 0x52, 0x28, 0xf0, 0x77, 0xa8, 0x7e, 0x92, 0x45, 0x13, 0xa6, 0x81, 0xdb, 0xda, + 0xfd, 0xe4, 0xda, 0x47, 0xef, 0xef, 0x85, 0x00, 0xb0, 0x2e, 0xb4, 0x6b, 0xe2, 0xa0, 0xf8, 0x43, + 0x54, 0x97, 0x6c, 0x54, 0x7e, 0x1f, 0x6f, 0xb9, 0x56, 0xea, 0x04, 0xa2, 0xc4, 0x65, 0x4d, 0xd3, + 0x3c, 0x51, 0x2c, 0xca, 0xa4, 0xfd, 0x12, 0x1a, 0x65, 0xd3, 0x07, 0x2e, 0x4e, 0x0a, 0x05, 0x26, + 0xa8, 0x49, 0xa3, 0x88, 0x29, 0x75, 0xc8, 0x66, 0xe0, 0xee, 0xd6, 0xee, 0x07, 0x15, 0xc3, 0xfa, + 0xe6, 0xca, 0x35, 0xf6, 0xec, 0xb3, 0x48, 0x32, 0x7d, 0xc8, 0x66, 0x7d, 0x36, 0x65, 0x91, 0x16, + 0xd2, 0xfa, 0xe7, 0x41, 0x5e, 0x4b, 0x4a, 0x8c, 0x61, 0xaa, 0x5c, 0xee, 0x3e, 0x82, 0xeb, 0x30, + 0x8b, 0x30, 0x29, 0x31, 0xf8, 0x29, 0xaa, 0xc1, 0xd0, 0xc0, 0xf2, 0xcd, 0xf0, 0x73, 0x77, 0x24, + 0x7b, 0xb5, 0xfe, 0x7b, 0xb1, 0x59, 0xf9, 0x19, 0x0a, 0x62, 0x9e, 0x70, 0x61, 0xff, 0xee, 0x8c, + 0x84, 0xff, 0x44, 0x68, 0x3e, 0xe4, 0x11, 0xd5, 0x5c, 0x24, 0xe5, 0x5d, 0x66, 0x71, 0xe6, 0xa5, + 0x0d, 0xf9, 0x54, 0x33, 0x09, 0x36, 0xff, 0x7f, 0x2f, 0xed, 0x11, 0x00, 0xec, 0x4b, 0xb3, 0x6b, + 0xe2, 0xa0, 0xdd, 0x43, 0xd4, 0xc8, 0x5f, 0x2a, 0x7e, 0xaf, 0x62, 0xc4, 0xb0, 0xe5, 0x0e, 0xb0, + 0x62, 0xce, 0x09, 0xae, 0xdc, 0x42, 0xab, 0x09, 0x8d, 0x9d, 0x29, 0xc3, 0x1b, 0x2e, 0xbf, 0xfa, + 0x84, 0xc6, 0x8c, 0x40, 0xa6, 0xfb, 0xcc, 0xc0, 0xec, 0x06, 0xc6, 0x0d, 0xa9, 0x64, 0x43, 0x7e, + 0xe6, 0x78, 0x85, 0x1b, 0x8e, 0x20, 0x4a, 0x5c, 0xd6, 0xe8, 0x54, 0x36, 0x34, 0xba, 0xe5, 0x97, + 0x75, 0x7d, 0x88, 0x12, 0x97, 0xed, 0xfe, 0xb9, 0x8c, 0x56, 0x8e, 0xc9, 0x01, 0xe8, 0xcd, 0x45, + 0xc0, 0x16, 0xb9, 0x70, 0x53, 0x98, 0x3b, 0x11, 0xfe, 0x9b, 0x6e, 0x33, 0xc5, 0xe4, 0x62, 0xb7, + 0xc7, 0x8a, 0x49, 0x02, 0x19, 0xe3, 0xc3, 0x94, 0x2a, 0xf5, 0xb3, 0x90, 0x03, 0xe7, 0xd8, 0xc2, + 0x87, 0x47, 0x2e, 0x4e, 0x0a, 0x85, 0xe1, 0x8d, 0x85, 0xd2, 0xe0, 0xd8, 0x0a, 0xef, 0x0b, 0xa1, + 0x34, 0x81, 0x8c, 0x51, 0xa4, 0x42, 0x6a, 0x30, 0x69, 0xad, 0x54, 0x1c, 0x09, 0xa9, 0x09, 0x64, + 0x40, 0x41, 0xf5, 0x18, 0x2c, 0x57, 0x61, 0x1c, 0x51, 0x3d, 0x26, 0x90, 0xc1, 0xef, 0xa3, 0xda, + 0x4f, 0x19, 0x93, 0x33, 0xe7, 0xa2, 0x9b, 0xb9, 0x8b, 0xbe, 0x36, 0x41, 0x62, 0x73, 0xa6, 0xf1, + 0xa1, 0xa4, 0xa3, 0xd8, 0xb8, 0xad, 0xf1, 0x72, 0xe3, 0x8f, 0x5c, 0x9c, 0x14, 0x8a, 0xf0, 0xf6, + 0xf9, 0x65, 0x67, 0xe9, 0xf9, 0x65, 0x67, 0xe9, 0xc5, 0x65, 0x67, 0xe9, 0x97, 0x79, 0xc7, 0x3b, + 0x9f, 0x77, 0xbc, 0xe7, 0xf3, 0x8e, 0xf7, 0x62, 0xde, 0xf1, 0xfe, 0x9e, 0x77, 0xbc, 0xdf, 0xfe, + 0xe9, 0x2c, 0x3d, 0xab, 0x5b, 0xb3, 0xfc, 0x17, 0x00, 0x00, 0xff, 0xff, 0x8b, 0xd7, 0x8c, 0x20, + 0x6f, 0x09, 0x00, 0x00, +} diff --git a/pkg/apis/common/generated.proto b/pkg/apis/common/generated.proto new file mode 100644 index 0000000000..71108a6ea6 --- /dev/null +++ b/pkg/apis/common/generated.proto @@ -0,0 +1,130 @@ +/* +Copyright 2018 BlackRock, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +// This file was autogenerated by go-to-protobuf. Do not edit it manually! + +syntax = 'proto2'; + +package github.com.argoproj.argo_events.pkg.apis.common; + +import "k8s.io/api/core/v1/generated.proto"; +import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; +import "k8s.io/apimachinery/pkg/runtime/generated.proto"; +import "k8s.io/apimachinery/pkg/util/intstr/generated.proto"; + +// Package-wide variables from generator "generated". +option go_package = "common"; + +// Event is a data record expressing an occurrence and its context. +// Adheres to the CloudEvents v0.1 specification +message Event { + optional EventContext context = 1; + + optional bytes data = 2; +} + +// EventContext contains metadata that provides circumstantial information about the occurrence. +message EventContext { + // The type of occurrence which has happened. Often this attribute is used for + // routing, observability, policy enforcement, etc. + // should be prefixed with a reverse-DNS name. The prefixed domain dictates + // the organization which defines the semantics of this event type. ex: com.github.pull.create + optional string eventType = 1; + + // The version of the eventType. Enables the interpretation of data by eventual consumers, + // requires the consumer to be knowledgeable about the producer. + optional string eventTypeVersion = 2; + + // The version of the CloudEvents specification which the event uses. + // Enables the interpretation of the context. + optional string cloudEventsVersion = 3; + + // This describes the event producer. + optional URI source = 4; + + // ID of the event. The semantics are explicitly undefined to ease the implementation of producers. + // Enables deduplication. Must be unique within scope of producer. + optional string eventID = 5; + + optional k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime eventTime = 6; + + // A link to the schema that the data attribute adheres to. + // Must adhere to the format specified in RFC 3986. + optional URI schemaURL = 7; + + // Content type of the data attribute value. Enables the data attribute to carry any type of content, + // whereby format and encoding might differ from that of the chosen event format. + // For example, the data attribute may carry an XML or JSON payload and the consumer is informed + // by this attribute being set to "application/xml" or "application/json" respectively. + optional string contentType = 8; + + // This is for additional metadata and does not have a mandated structure. + // Enables a place for custom fields a producer or middleware might want to include and provides a place + // to test metadata before adding them to the CloudEvents specification. + map extensions = 9; +} + +// S3Artifact contains information about an artifact in S3 +message S3Artifact { + optional string endpoint = 1; + + optional S3Bucket bucket = 2; + + optional string region = 3; + + optional bool insecure = 4; + + optional k8s.io.api.core.v1.SecretKeySelector accessKey = 5; + + optional k8s.io.api.core.v1.SecretKeySelector secretKey = 6; + + optional string event = 7; + + optional S3Filter filter = 8; +} + +// Name contains information for an S3 Name +message S3Bucket { + optional string key = 1; + + optional string name = 2; +} + +// S3Filter represents filters to apply to bucket nofifications for specifying constraints on objects +message S3Filter { + optional string prefix = 1; + + optional string suffix = 2; +} + +// URI is a Uniform Resource Identifier based on RFC 3986 +message URI { + optional string scheme = 1; + + optional string user = 2; + + optional string password = 3; + + optional string host = 4; + + optional int32 port = 5; + + optional string path = 6; + + optional string query = 7; + + optional string fragment = 8; +} + diff --git a/pkg/apis/common/s3.go b/pkg/apis/common/s3.go new file mode 100644 index 0000000000..f7428b27ea --- /dev/null +++ b/pkg/apis/common/s3.go @@ -0,0 +1,46 @@ +/* +Copyright 2018 BlackRock, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package common + +import ( + "github.com/minio/minio-go" + corev1 "k8s.io/api/core/v1" +) + +// S3Artifact contains information about an artifact in S3 +type S3Artifact struct { + Endpoint string `json:"endpoint" protobuf:"bytes,1,opt,name=endpoint"` + Bucket *S3Bucket `json:"bucket" protobuf:"bytes,2,opt,name=bucket"` + Region string `json:"region,omitempty" protobuf:"bytes,3,opt,name=region"` + Insecure bool `json:"insecure,omitempty" protobuf:"varint,4,opt,name=insecure"` + AccessKey *corev1.SecretKeySelector `json:"accessKey" protobuf:"bytes,5,opt,name=accessKey"` + SecretKey *corev1.SecretKeySelector `json:"secretKey" protobuf:"bytes,6,opt,name=secretKey"` + Event minio.NotificationEventType `json:"event,omitempty" protobuf:"bytes,7,opt,name=event"` + Filter *S3Filter `json:"filter,omitempty" protobuf:"bytes,8,opt,name=filter"` +} + +// Name contains information for an S3 Name +type S3Bucket struct { + Key string `json:"key,omitempty" protobuf:"bytes,1,opt,name=key"` + Name string `json:"name" protobuf:"bytes,2,opt,name=name"` +} + +// S3Filter represents filters to apply to bucket nofifications for specifying constraints on objects +type S3Filter struct { + Prefix string `json:"prefix" protobuf:"bytes,1,opt,name=prefix"` + Suffix string `json:"suffix" protobuf:"bytes,2,opt,name=suffix"` +} diff --git a/pkg/apis/gateway/v1alpha1/generated.pb.go b/pkg/apis/gateway/v1alpha1/generated.pb.go index c81183990d..6fa3d24910 100644 --- a/pkg/apis/gateway/v1alpha1/generated.pb.go +++ b/pkg/apis/gateway/v1alpha1/generated.pb.go @@ -23,7 +23,7 @@ import math "math" import v11 "k8s.io/api/core/v1" -import github_com_argoproj_argo_events_pkg_common "github.com/argoproj/argo-events/pkg/common" +import github_com_argoproj_argo_events_pkg_apis_common "github.com/argoproj/argo-events/pkg/apis/common" import github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys" @@ -46,7 +46,7 @@ const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package func (m *EventProtocol) Reset() { *m = EventProtocol{} } func (*EventProtocol) ProtoMessage() {} func (*EventProtocol) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_8f30663b6aeb413e, []int{0} + return fileDescriptor_generated_c8a632955ef38b96, []int{0} } func (m *EventProtocol) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -74,7 +74,7 @@ var xxx_messageInfo_EventProtocol proto.InternalMessageInfo func (m *Gateway) Reset() { *m = Gateway{} } func (*Gateway) ProtoMessage() {} func (*Gateway) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_8f30663b6aeb413e, []int{1} + return fileDescriptor_generated_c8a632955ef38b96, []int{1} } func (m *Gateway) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -102,7 +102,7 @@ var xxx_messageInfo_Gateway proto.InternalMessageInfo func (m *GatewayList) Reset() { *m = GatewayList{} } func (*GatewayList) ProtoMessage() {} func (*GatewayList) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_8f30663b6aeb413e, []int{2} + return fileDescriptor_generated_c8a632955ef38b96, []int{2} } func (m *GatewayList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -130,7 +130,7 @@ var xxx_messageInfo_GatewayList proto.InternalMessageInfo func (m *GatewayNotificationWatcher) Reset() { *m = GatewayNotificationWatcher{} } func (*GatewayNotificationWatcher) ProtoMessage() {} func (*GatewayNotificationWatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_8f30663b6aeb413e, []int{3} + return fileDescriptor_generated_c8a632955ef38b96, []int{3} } func (m *GatewayNotificationWatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -158,7 +158,7 @@ var xxx_messageInfo_GatewayNotificationWatcher proto.InternalMessageInfo func (m *GatewaySpec) Reset() { *m = GatewaySpec{} } func (*GatewaySpec) ProtoMessage() {} func (*GatewaySpec) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_8f30663b6aeb413e, []int{4} + return fileDescriptor_generated_c8a632955ef38b96, []int{4} } func (m *GatewaySpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -186,7 +186,7 @@ var xxx_messageInfo_GatewaySpec proto.InternalMessageInfo func (m *GatewayStatus) Reset() { *m = GatewayStatus{} } func (*GatewayStatus) ProtoMessage() {} func (*GatewayStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_8f30663b6aeb413e, []int{5} + return fileDescriptor_generated_c8a632955ef38b96, []int{5} } func (m *GatewayStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -214,7 +214,7 @@ var xxx_messageInfo_GatewayStatus proto.InternalMessageInfo func (m *Http) Reset() { *m = Http{} } func (*Http) ProtoMessage() {} func (*Http) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_8f30663b6aeb413e, []int{6} + return fileDescriptor_generated_c8a632955ef38b96, []int{6} } func (m *Http) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -242,7 +242,7 @@ var xxx_messageInfo_Http proto.InternalMessageInfo func (m *Nats) Reset() { *m = Nats{} } func (*Nats) ProtoMessage() {} func (*Nats) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_8f30663b6aeb413e, []int{7} + return fileDescriptor_generated_c8a632955ef38b96, []int{7} } func (m *Nats) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -270,7 +270,7 @@ var xxx_messageInfo_Nats proto.InternalMessageInfo func (m *NodeStatus) Reset() { *m = NodeStatus{} } func (*NodeStatus) ProtoMessage() {} func (*NodeStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_8f30663b6aeb413e, []int{8} + return fileDescriptor_generated_c8a632955ef38b96, []int{8} } func (m *NodeStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -298,7 +298,7 @@ var xxx_messageInfo_NodeStatus proto.InternalMessageInfo func (m *NotificationWatchers) Reset() { *m = NotificationWatchers{} } func (*NotificationWatchers) ProtoMessage() {} func (*NotificationWatchers) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_8f30663b6aeb413e, []int{9} + return fileDescriptor_generated_c8a632955ef38b96, []int{9} } func (m *NotificationWatchers) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -326,7 +326,7 @@ var xxx_messageInfo_NotificationWatchers proto.InternalMessageInfo func (m *SensorNotificationWatcher) Reset() { *m = SensorNotificationWatcher{} } func (*SensorNotificationWatcher) ProtoMessage() {} func (*SensorNotificationWatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_8f30663b6aeb413e, []int{10} + return fileDescriptor_generated_c8a632955ef38b96, []int{10} } func (m *SensorNotificationWatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1257,7 +1257,7 @@ func (m *EventProtocol) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Type = github_com_argoproj_argo_events_pkg_common.EventProtocolType(dAtA[iNdEx:postIndex]) + m.Type = github_com_argoproj_argo_events_pkg_apis_common.EventProtocolType(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { @@ -2448,7 +2448,7 @@ func (m *Nats) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Type = github_com_argoproj_argo_events_pkg_common.NatsType(dAtA[iNdEx:postIndex]) + m.Type = github_com_argoproj_argo_events_pkg_apis_common.NatsType(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: if wireType != 2 { @@ -3081,86 +3081,85 @@ var ( ) func init() { - proto.RegisterFile("github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1/generated.proto", fileDescriptor_generated_8f30663b6aeb413e) -} - -var fileDescriptor_generated_8f30663b6aeb413e = []byte{ - // 1217 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0x4f, 0x6f, 0x1b, 0x45, - 0x14, 0xcf, 0xfa, 0x4f, 0x6c, 0x8f, 0xe3, 0xb6, 0x0c, 0x45, 0x18, 0x23, 0x9c, 0x68, 0x4f, 0x01, - 0xb5, 0xbb, 0x4d, 0x0a, 0x28, 0xfc, 0x13, 0xc2, 0x49, 0x68, 0x22, 0x25, 0x69, 0x34, 0x4e, 0xa8, - 0x44, 0x91, 0xc8, 0x64, 0x77, 0xb2, 0xde, 0xc6, 0xbb, 0xb3, 0xda, 0x19, 0xbb, 0xf8, 0x54, 0x24, - 0xc4, 0x15, 0xf1, 0x05, 0x38, 0xf2, 0x19, 0xf8, 0x02, 0x48, 0xe4, 0xd8, 0x03, 0x87, 0x5e, 0x88, - 0x88, 0xf9, 0x08, 0xdc, 0x7a, 0xaa, 0x66, 0x76, 0xf6, 0x8f, 0x93, 0x58, 0x71, 0xeb, 0xde, 0x76, - 0xde, 0xfc, 0xde, 0xef, 0xbd, 0x79, 0xef, 0xcd, 0xcf, 0x63, 0xb0, 0xe9, 0xb8, 0xbc, 0xd3, 0x3b, - 0x34, 0x2c, 0xea, 0x99, 0x38, 0x74, 0x68, 0x10, 0xd2, 0x47, 0xf2, 0xe3, 0x36, 0xe9, 0x13, 0x9f, - 0x33, 0x33, 0x38, 0x76, 0x4c, 0x1c, 0xb8, 0xcc, 0x74, 0x30, 0x27, 0x8f, 0xf1, 0xc0, 0xec, 0x2f, - 0xe1, 0x6e, 0xd0, 0xc1, 0x4b, 0xa6, 0x43, 0x7c, 0x12, 0x62, 0x4e, 0x6c, 0x23, 0x08, 0x29, 0xa7, - 0xf0, 0x93, 0x94, 0xca, 0x88, 0xa9, 0xe4, 0xc7, 0xf7, 0x11, 0x95, 0x11, 0x1c, 0x3b, 0x86, 0xa0, - 0x32, 0x14, 0x95, 0x11, 0x53, 0x35, 0x36, 0x26, 0xce, 0x82, 0x11, 0x9f, 0xd1, 0x70, 0x6c, 0x12, - 0x8d, 0xdb, 0x19, 0x26, 0x87, 0x3a, 0xd4, 0x94, 0xe6, 0xc3, 0xde, 0x91, 0x5c, 0xc9, 0x85, 0xfc, - 0x52, 0x70, 0xfd, 0x78, 0x85, 0x19, 0x2e, 0x15, 0xdc, 0xa6, 0x45, 0x43, 0x62, 0xf6, 0x2f, 0x52, - 0x7e, 0x98, 0x62, 0x3c, 0x6c, 0x75, 0x5c, 0x9f, 0x84, 0x83, 0x34, 0x21, 0x8f, 0x70, 0x7c, 0x99, - 0x97, 0x39, 0xce, 0x2b, 0xec, 0xf9, 0xdc, 0xf5, 0xc8, 0x05, 0x87, 0x8f, 0xaf, 0x72, 0x60, 0x56, - 0x87, 0x78, 0xf8, 0x82, 0xdf, 0xdd, 0x71, 0x7e, 0x3d, 0xee, 0x76, 0x4d, 0xd7, 0xe7, 0x8c, 0x87, - 0xe7, 0x9d, 0xf4, 0x3f, 0x72, 0xa0, 0xb6, 0x2e, 0x4a, 0xbb, 0x2b, 0x96, 0x16, 0xed, 0xc2, 0x03, - 0x50, 0xe0, 0x83, 0x80, 0xd4, 0xb5, 0x05, 0x6d, 0xb1, 0xd2, 0xda, 0x3a, 0x39, 0x9d, 0x9f, 0x19, - 0x9e, 0xce, 0x17, 0xf6, 0x06, 0x01, 0x79, 0x7e, 0x3a, 0xff, 0xf9, 0x24, 0x0d, 0xb2, 0xa8, 0xe7, - 0x51, 0xdf, 0x18, 0xe1, 0x15, 0xfe, 0x48, 0x32, 0x43, 0x0c, 0x0a, 0x1d, 0xce, 0x83, 0x7a, 0x6e, - 0x41, 0x5b, 0xac, 0x2e, 0x7f, 0x69, 0xbc, 0xf2, 0xb8, 0x18, 0x1b, 0x9c, 0x07, 0xad, 0xb9, 0x38, - 0x45, 0xb1, 0x42, 0x92, 0x5a, 0x84, 0xf0, 0x31, 0x67, 0xf5, 0xfc, 0xd4, 0x21, 0x76, 0x30, 0x67, - 0x69, 0x08, 0xb1, 0x42, 0x92, 0x5a, 0xff, 0x2b, 0x07, 0x4a, 0xf7, 0x22, 0x34, 0x3c, 0x00, 0x65, - 0xd1, 0x7e, 0x1b, 0x73, 0x2c, 0xeb, 0x56, 0x5d, 0xbe, 0x63, 0x44, 0xdd, 0x30, 0xb2, 0xdd, 0x48, - 0xc3, 0x08, 0xb4, 0xd1, 0x5f, 0x32, 0xee, 0x1f, 0x3e, 0x22, 0x16, 0xdf, 0x26, 0x1c, 0xb7, 0xa0, - 0x8a, 0x01, 0x52, 0x1b, 0x4a, 0x58, 0x61, 0x00, 0x66, 0x19, 0xc7, 0xbc, 0xc7, 0x54, 0xd5, 0x36, - 0xa6, 0x38, 0x92, 0xca, 0xba, 0x2d, 0xf9, 0x5a, 0xd7, 0x54, 0xdc, 0xd9, 0x68, 0x8d, 0x54, 0x1c, - 0xd8, 0x01, 0x05, 0x16, 0x10, 0x4b, 0x95, 0xf0, 0xeb, 0xd7, 0x10, 0x2f, 0x20, 0x56, 0x5a, 0x49, - 0xb1, 0x42, 0x32, 0x82, 0xfe, 0xb7, 0x06, 0xaa, 0x0a, 0xb3, 0xe5, 0x32, 0x0e, 0xbf, 0xbb, 0x50, - 0x4d, 0x63, 0xb2, 0x6a, 0x0a, 0x6f, 0x59, 0xcb, 0x1b, 0x2a, 0x4a, 0x39, 0xb6, 0x64, 0x2a, 0xe9, - 0x80, 0xa2, 0xcb, 0x89, 0x27, 0x0a, 0x99, 0x5f, 0xac, 0x2e, 0xb7, 0xa6, 0x3f, 0x58, 0xab, 0xa6, - 0xc2, 0x15, 0x37, 0x05, 0x31, 0x8a, 0xf8, 0xf5, 0x5f, 0x34, 0xd0, 0x50, 0x88, 0x1d, 0xca, 0xdd, - 0x23, 0xd7, 0xc2, 0xdc, 0xa5, 0xfe, 0x03, 0xcc, 0xad, 0x0e, 0x09, 0xe1, 0x82, 0x18, 0x51, 0x2f, - 0xbe, 0x67, 0x99, 0x09, 0xf3, 0x08, 0x92, 0x3b, 0x02, 0x11, 0xd0, 0x90, 0xcb, 0x8e, 0x67, 0x10, - 0xbb, 0x34, 0xe4, 0x48, 0xee, 0xc0, 0x5b, 0xa0, 0x4c, 0x7c, 0x3b, 0xa0, 0xae, 0xcf, 0x65, 0x9f, - 0x2a, 0xe9, 0xc9, 0xd7, 0x95, 0x1d, 0x25, 0x08, 0xfd, 0xff, 0x42, 0x52, 0x67, 0x51, 0x7d, 0x78, - 0x0f, 0x00, 0x9b, 0x04, 0x5d, 0x2a, 0x57, 0xaa, 0xd2, 0x6f, 0x67, 0x2a, 0x6d, 0x08, 0x21, 0x14, - 0x75, 0xdd, 0xa5, 0x76, 0xeb, 0x9a, 0x18, 0xcd, 0xb5, 0x04, 0x8e, 0x32, 0xae, 0xd0, 0x04, 0x15, - 0x8b, 0xfa, 0x47, 0xae, 0xe3, 0xe1, 0x40, 0x65, 0xfb, 0x86, 0xca, 0xa3, 0xb2, 0x2a, 0x37, 0xb6, - 0x71, 0x80, 0x52, 0x8c, 0x38, 0x99, 0xd4, 0x98, 0xfc, 0xe8, 0xc9, 0x32, 0x1a, 0xb1, 0x02, 0xe6, - 0x64, 0xf9, 0xbf, 0x21, 0x21, 0x73, 0xa9, 0x5f, 0x2f, 0x48, 0xe4, 0x4d, 0x85, 0x9c, 0x5b, 0xcf, - 0xec, 0xa1, 0x11, 0x24, 0xdc, 0x01, 0x55, 0x46, 0xc2, 0xbe, 0x6b, 0x11, 0x79, 0xac, 0xa2, 0x3c, - 0xd6, 0xbb, 0x97, 0x1d, 0xab, 0x1d, 0xc1, 0x5a, 0xd7, 0x87, 0xa7, 0xf3, 0xd5, 0x76, 0xea, 0x83, - 0xb2, 0x04, 0x70, 0x00, 0xca, 0x8f, 0xa3, 0x96, 0xb1, 0xfa, 0xac, 0x24, 0xbb, 0x3f, 0x8d, 0x9c, - 0x5c, 0x9c, 0x04, 0xd6, 0x9a, 0x13, 0x0d, 0x8b, 0x57, 0x28, 0x09, 0x07, 0x3f, 0x03, 0xb5, 0x20, - 0xa4, 0x16, 0x61, 0x8c, 0x86, 0xa2, 0xeb, 0xf5, 0x92, 0xac, 0xc2, 0x5b, 0xaa, 0x0a, 0xb5, 0xdd, - 0xec, 0x26, 0x1a, 0xc5, 0xc2, 0x9f, 0x35, 0x50, 0x23, 0x59, 0x05, 0xae, 0x97, 0xa7, 0x56, 0x8e, - 0x11, 0x45, 0x4f, 0xf3, 0x18, 0x31, 0xa3, 0xd1, 0xa8, 0xfa, 0x9f, 0x79, 0x50, 0x1b, 0x51, 0x1c, - 0x78, 0x07, 0x14, 0x83, 0x0e, 0x66, 0xf1, 0xe8, 0x37, 0xe2, 0xdb, 0xb3, 0x2b, 0x8c, 0xcf, 0x4f, - 0xe7, 0x2b, 0x3b, 0xd4, 0x26, 0x72, 0x81, 0x22, 0x20, 0x7c, 0x08, 0x2a, 0x8c, 0xe3, 0x90, 0x13, - 0xfb, 0x2b, 0xae, 0x04, 0xf0, 0x83, 0xc9, 0x24, 0x61, 0xcf, 0xf5, 0x48, 0x3a, 0x8c, 0xed, 0x98, - 0x04, 0xa5, 0x7c, 0xf0, 0x7d, 0x50, 0xf2, 0x08, 0x63, 0xd8, 0x21, 0x6a, 0xca, 0xae, 0x2b, 0x78, - 0x69, 0x3b, 0x32, 0xa3, 0x78, 0x1f, 0xfe, 0x00, 0x8a, 0x3e, 0xb5, 0x09, 0xab, 0x17, 0xa5, 0x76, - 0xb4, 0x5f, 0x97, 0x08, 0x1b, 0xe2, 0xc4, 0x6c, 0xdd, 0xe7, 0x61, 0x46, 0x4c, 0xa4, 0x0d, 0x45, - 0x01, 0x1b, 0x4f, 0x00, 0x48, 0x31, 0xf0, 0x06, 0xc8, 0x1f, 0x93, 0x41, 0x54, 0x3f, 0x24, 0x3e, - 0xe1, 0x43, 0x50, 0xec, 0xe3, 0x6e, 0x8f, 0xa8, 0xea, 0xac, 0x4f, 0x35, 0xa2, 0x36, 0x51, 0xbf, - 0x05, 0x11, 0xe7, 0xa7, 0xb9, 0x15, 0x4d, 0x5f, 0x04, 0xf2, 0xf7, 0x35, 0x11, 0x25, 0x6d, 0x9c, - 0x28, 0xe9, 0xff, 0x68, 0x40, 0xfe, 0x4e, 0xc2, 0xf7, 0x40, 0xbe, 0x17, 0x76, 0x15, 0xb2, 0xaa, - 0x90, 0xf9, 0x7d, 0xb4, 0x85, 0x84, 0x1d, 0x3e, 0x50, 0x22, 0x10, 0x09, 0xc6, 0xea, 0xb9, 0x87, - 0xc6, 0xdd, 0x97, 0x78, 0x68, 0x88, 0x68, 0x19, 0xed, 0xb8, 0x05, 0xca, 0x56, 0xd7, 0x25, 0x3e, - 0xdf, 0xb4, 0xcf, 0xab, 0xe2, 0xaa, 0xb2, 0xa3, 0x04, 0x21, 0xc5, 0xab, 0xdb, 0x63, 0x9c, 0x84, - 0x9b, 0xb6, 0x1a, 0x80, 0x54, 0xbc, 0xe2, 0x0d, 0x94, 0x62, 0xf4, 0xdf, 0xf3, 0x51, 0x2f, 0xd4, - 0x34, 0x37, 0x40, 0xce, 0xb5, 0xd5, 0x21, 0x81, 0x72, 0xcc, 0x6d, 0xae, 0xa1, 0x9c, 0x6b, 0x27, - 0x1a, 0x9f, 0x1f, 0xab, 0xf1, 0x1f, 0x81, 0xaa, 0xed, 0xb2, 0xa0, 0x8b, 0x07, 0xc2, 0x28, 0xd5, - 0xaa, 0xd2, 0x7a, 0x53, 0x01, 0xab, 0x6b, 0xe9, 0x16, 0xca, 0xe2, 0xd2, 0x2b, 0x34, 0x3b, 0xe9, - 0x15, 0x3a, 0xc8, 0x5e, 0xa1, 0x92, 0x1c, 0x12, 0x73, 0xb2, 0x2b, 0xb4, 0xed, 0x5a, 0x21, 0x7d, - 0xb9, 0x7b, 0x54, 0xbe, 0xe2, 0x1e, 0x59, 0x00, 0xf4, 0x02, 0x1b, 0x73, 0x22, 0x68, 0xeb, 0x95, - 0x57, 0xcb, 0x26, 0x79, 0x30, 0xed, 0x27, 0x54, 0x28, 0x43, 0xab, 0xff, 0x96, 0x03, 0x37, 0x2f, - 0x93, 0x5b, 0xf8, 0x93, 0x06, 0xca, 0x6a, 0xea, 0x59, 0x5d, 0x93, 0x37, 0x79, 0x7f, 0xfa, 0x9b, - 0x7c, 0x49, 0xa8, 0x74, 0xee, 0x14, 0x86, 0xa1, 0x24, 0x30, 0x7c, 0x02, 0x4a, 0xd1, 0x7f, 0x98, - 0xf8, 0x25, 0xb2, 0x37, 0x45, 0x0e, 0x6d, 0xc9, 0x74, 0x59, 0x0a, 0x49, 0x13, 0x22, 0x08, 0x43, - 0x71, 0x54, 0xfd, 0x0b, 0xf0, 0xce, 0x58, 0xb7, 0xab, 0x5f, 0x27, 0x2d, 0xe3, 0xe4, 0xac, 0x39, - 0xf3, 0xf4, 0xac, 0x39, 0xf3, 0xec, 0xac, 0x39, 0xf3, 0xe3, 0xb0, 0xa9, 0x9d, 0x0c, 0x9b, 0xda, - 0xd3, 0x61, 0x53, 0x7b, 0x36, 0x6c, 0x6a, 0xff, 0x0e, 0x9b, 0xda, 0xaf, 0xff, 0x35, 0x67, 0xbe, - 0x2d, 0xc7, 0x29, 0xbe, 0x08, 0x00, 0x00, 0xff, 0xff, 0x16, 0xab, 0x38, 0xfb, 0x61, 0x0e, 0x00, - 0x00, + proto.RegisterFile("github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1/generated.proto", fileDescriptor_generated_c8a632955ef38b96) +} + +var fileDescriptor_generated_c8a632955ef38b96 = []byte{ + // 1214 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0x4d, 0x6f, 0x1b, 0xc5, + 0x1b, 0xcf, 0xfa, 0x25, 0xb6, 0xc7, 0x71, 0xdb, 0xff, 0xfc, 0x8b, 0x30, 0x46, 0x38, 0xd5, 0x9e, + 0x02, 0x6a, 0x77, 0x9b, 0xf0, 0xa2, 0x00, 0x42, 0x55, 0xdd, 0x84, 0x26, 0x52, 0x93, 0x86, 0x71, + 0x02, 0x12, 0xad, 0x44, 0x27, 0xbb, 0x93, 0xf5, 0x36, 0xde, 0x9d, 0xd1, 0xce, 0xd8, 0xc5, 0xa7, + 0x22, 0x21, 0xae, 0x88, 0x2f, 0xc0, 0x91, 0x6f, 0xc1, 0x11, 0x89, 0x1c, 0x7b, 0xe0, 0xd0, 0x53, + 0x44, 0xcc, 0x47, 0xe0, 0xd6, 0x13, 0x9a, 0xd9, 0xd9, 0x17, 0xe7, 0x45, 0x49, 0xea, 0xde, 0x76, + 0x9e, 0xf9, 0x3d, 0xbf, 0xe7, 0x65, 0x9e, 0xf9, 0xed, 0x80, 0x75, 0xcf, 0x17, 0xbd, 0xc1, 0xae, + 0xe5, 0xd0, 0xc0, 0xc6, 0x91, 0x47, 0x59, 0x44, 0x9f, 0xaa, 0x8f, 0x5b, 0x64, 0x48, 0x42, 0xc1, + 0x6d, 0xb6, 0xef, 0xd9, 0x98, 0xf9, 0xdc, 0xf6, 0xb0, 0x20, 0xcf, 0xf0, 0xc8, 0x1e, 0x2e, 0xe2, + 0x3e, 0xeb, 0xe1, 0x45, 0xdb, 0x23, 0x21, 0x89, 0xb0, 0x20, 0xae, 0xc5, 0x22, 0x2a, 0x28, 0xfc, + 0x34, 0xa3, 0xb2, 0x12, 0x2a, 0xf5, 0xf1, 0x5d, 0x4c, 0x65, 0xb1, 0x7d, 0xcf, 0x92, 0x54, 0x96, + 0xa6, 0xb2, 0x12, 0xaa, 0xd6, 0x9d, 0x0b, 0x67, 0xe1, 0xd0, 0x20, 0xa0, 0xe1, 0xf1, 0xd8, 0xad, + 0x5b, 0x39, 0x02, 0x8f, 0x7a, 0xd4, 0x56, 0xe6, 0xdd, 0xc1, 0x9e, 0x5a, 0xa9, 0x85, 0xfa, 0xd2, + 0x70, 0x73, 0x7f, 0x99, 0x5b, 0x3e, 0x95, 0x94, 0xb6, 0x43, 0x23, 0x62, 0x0f, 0x4f, 0x94, 0xd3, + 0xfa, 0x28, 0xc3, 0x04, 0xd8, 0xe9, 0xf9, 0x21, 0x89, 0x46, 0x59, 0x1e, 0x01, 0x11, 0xf8, 0x34, + 0x2f, 0xfb, 0x2c, 0xaf, 0x68, 0x10, 0x0a, 0x3f, 0x20, 0x27, 0x1c, 0x3e, 0x39, 0xcf, 0x81, 0x3b, + 0x3d, 0x12, 0xe0, 0x13, 0x7e, 0x1f, 0x9e, 0xe5, 0x37, 0x10, 0x7e, 0xdf, 0xf6, 0x43, 0xc1, 0x45, + 0x74, 0xdc, 0xc9, 0xfc, 0xbd, 0x00, 0x1a, 0xab, 0xb2, 0xa3, 0x5b, 0x72, 0xe9, 0xd0, 0x3e, 0x24, + 0xa0, 0x24, 0x46, 0x8c, 0x34, 0x8d, 0x1b, 0xc6, 0x42, 0xad, 0xf3, 0xd5, 0xc1, 0xe1, 0xfc, 0xcc, + 0xf8, 0x70, 0xbe, 0xb4, 0x3d, 0x62, 0xe4, 0xd5, 0xe1, 0xfc, 0xdd, 0x4b, 0x9e, 0x8b, 0x35, 0x41, + 0x2e, 0x49, 0x90, 0xa2, 0x87, 0x18, 0x94, 0x7a, 0x42, 0xb0, 0x66, 0xe1, 0x86, 0xb1, 0x50, 0x5f, + 0xba, 0x63, 0xbd, 0xf6, 0xa8, 0x58, 0x6b, 0x42, 0xb0, 0xce, 0x5c, 0x92, 0xa7, 0x5c, 0x21, 0x45, + 0x2d, 0x43, 0x84, 0x58, 0xf0, 0x66, 0x71, 0xea, 0x10, 0x9b, 0x58, 0xf0, 0x2c, 0x84, 0x5c, 0x21, + 0x45, 0x6d, 0xfe, 0x59, 0x00, 0x95, 0xfb, 0x31, 0x1a, 0x3e, 0x01, 0x55, 0x39, 0x03, 0x2e, 0x16, + 0x58, 0x35, 0xaf, 0xbe, 0x74, 0xdb, 0x8a, 0x8f, 0xc4, 0xca, 0x1f, 0x49, 0x16, 0x46, 0xa2, 0xad, + 0xe1, 0xa2, 0xf5, 0x70, 0xf7, 0x29, 0x71, 0xc4, 0x06, 0x11, 0xb8, 0x03, 0x75, 0x0c, 0x90, 0xd9, + 0x50, 0xca, 0x0a, 0x19, 0x98, 0xe5, 0x02, 0x8b, 0x01, 0xd7, 0x5d, 0x5b, 0x9b, 0xa2, 0x24, 0x9d, + 0x75, 0x57, 0xf1, 0x75, 0xae, 0xe8, 0xb8, 0xb3, 0xf1, 0x1a, 0xe9, 0x38, 0xb0, 0x07, 0x4a, 0x9c, + 0x11, 0x47, 0xb7, 0xf0, 0xcb, 0x37, 0x10, 0x8f, 0x11, 0x27, 0xeb, 0xa4, 0x5c, 0x21, 0x15, 0xc1, + 0xfc, 0xcb, 0x00, 0x75, 0x8d, 0x79, 0xe0, 0x73, 0x01, 0x1f, 0x9f, 0xe8, 0xa6, 0x75, 0xb1, 0x6e, + 0x4a, 0x6f, 0xd5, 0xcb, 0x6b, 0x3a, 0x4a, 0x35, 0xb1, 0xe4, 0x3a, 0xe9, 0x81, 0xb2, 0x2f, 0x48, + 0x20, 0x1b, 0x59, 0x5c, 0xa8, 0x2f, 0x75, 0xa6, 0x2f, 0xac, 0xd3, 0xd0, 0xe1, 0xca, 0xeb, 0x92, + 0x18, 0xc5, 0xfc, 0xe6, 0xcf, 0x06, 0x68, 0x69, 0xc4, 0x26, 0x15, 0xfe, 0x9e, 0xef, 0x60, 0xe1, + 0xd3, 0xf0, 0x1b, 0x2c, 0x9c, 0x1e, 0x89, 0xe0, 0x0d, 0x39, 0xa2, 0x41, 0x72, 0xd9, 0x72, 0x13, + 0x16, 0x10, 0xa4, 0x76, 0x24, 0x82, 0xd1, 0x48, 0xa8, 0x13, 0xcf, 0x21, 0xb6, 0x68, 0x24, 0x90, + 0xda, 0x81, 0x37, 0x41, 0x95, 0x84, 0x2e, 0xa3, 0x7e, 0x28, 0xd4, 0x39, 0xd5, 0xb2, 0xca, 0x57, + 0xb5, 0x1d, 0xa5, 0x08, 0xf3, 0xdf, 0x52, 0xda, 0x67, 0xd9, 0x7d, 0x78, 0x1f, 0x00, 0x97, 0xb0, + 0x3e, 0x55, 0x2b, 0xdd, 0xe9, 0xb7, 0x73, 0x9d, 0xb6, 0xa4, 0x1a, 0xca, 0xbe, 0x6e, 0x51, 0xb7, + 0x73, 0x45, 0x8e, 0xe6, 0x4a, 0x0a, 0x47, 0x39, 0x57, 0x68, 0x83, 0x9a, 0x43, 0xc3, 0x3d, 0xdf, + 0x0b, 0x30, 0xd3, 0xd9, 0xfe, 0x4f, 0xe7, 0x51, 0xbb, 0xa7, 0x36, 0x36, 0x30, 0x43, 0x19, 0x46, + 0x56, 0xa6, 0x84, 0xa6, 0x38, 0x59, 0x59, 0x4e, 0x23, 0x96, 0xc1, 0x9c, 0x6a, 0xff, 0xd7, 0x24, + 0xe2, 0x3e, 0x0d, 0x9b, 0x25, 0x85, 0xbc, 0xae, 0x91, 0x73, 0xab, 0xb9, 0x3d, 0x34, 0x81, 0x84, + 0x9b, 0xa0, 0xce, 0x49, 0x34, 0xf4, 0x1d, 0xa2, 0xca, 0x2a, 0xab, 0xb2, 0xde, 0x3d, 0xad, 0xac, + 0x6e, 0x0c, 0xeb, 0x5c, 0x1d, 0x1f, 0xce, 0xd7, 0xbb, 0x99, 0x0f, 0xca, 0x13, 0xc0, 0x11, 0xa8, + 0x3e, 0x8b, 0x8f, 0x8c, 0x37, 0x67, 0x15, 0xd9, 0xc3, 0x69, 0xe4, 0xe4, 0xe4, 0x24, 0xf0, 0xce, + 0x9c, 0x3c, 0xb0, 0x64, 0x85, 0xd2, 0x70, 0xf0, 0x73, 0xd0, 0x60, 0x11, 0x75, 0x08, 0xe7, 0x34, + 0x92, 0xa7, 0xde, 0xac, 0xa8, 0x2e, 0xbc, 0xa5, 0xbb, 0xd0, 0xd8, 0xca, 0x6f, 0xa2, 0x49, 0x2c, + 0xfc, 0xc9, 0x00, 0x0d, 0x92, 0x57, 0xe0, 0x66, 0x75, 0x6a, 0xe5, 0x98, 0x50, 0xf4, 0x2c, 0x8f, + 0x09, 0x33, 0x9a, 0x8c, 0x6a, 0xfe, 0x51, 0x04, 0x8d, 0x09, 0xc5, 0x81, 0xb7, 0x41, 0x99, 0xf5, + 0x30, 0x4f, 0x46, 0xbf, 0x95, 0xdc, 0x9e, 0x2d, 0x69, 0x7c, 0x75, 0x38, 0x5f, 0xdb, 0xa4, 0x2e, + 0x51, 0x0b, 0x14, 0x03, 0xe1, 0x23, 0x50, 0xe3, 0x02, 0x47, 0x82, 0xb8, 0x77, 0x85, 0x16, 0xc0, + 0x0f, 0x2e, 0x26, 0x09, 0xdb, 0x7e, 0x40, 0xb2, 0x61, 0xec, 0x26, 0x24, 0x28, 0xe3, 0x83, 0xef, + 0x83, 0x4a, 0x40, 0x38, 0xc7, 0x1e, 0xd1, 0x53, 0x76, 0x55, 0xc3, 0x2b, 0x1b, 0xb1, 0x19, 0x25, + 0xfb, 0xf0, 0x7b, 0x50, 0x0e, 0xa9, 0x4b, 0x78, 0xb3, 0xac, 0xb4, 0xa3, 0xfb, 0xa6, 0x44, 0xd8, + 0x92, 0x15, 0xf3, 0xd5, 0x50, 0x44, 0x39, 0x31, 0x51, 0x36, 0x14, 0x07, 0x6c, 0x3d, 0x07, 0x20, + 0xc3, 0xc0, 0x6b, 0xa0, 0xb8, 0x4f, 0x46, 0x71, 0xff, 0x90, 0xfc, 0x84, 0x8f, 0x40, 0x79, 0x88, + 0xfb, 0x03, 0xa2, 0xbb, 0xb3, 0x3a, 0xd5, 0x88, 0xba, 0x44, 0xff, 0x0b, 0x62, 0xce, 0xcf, 0x0a, + 0xcb, 0x86, 0xb9, 0x00, 0xd4, 0xff, 0x35, 0x15, 0x25, 0xe3, 0x2c, 0x51, 0x32, 0xc7, 0x06, 0x50, + 0xff, 0x49, 0xf8, 0x1e, 0x28, 0x0e, 0xa2, 0xbe, 0x46, 0xd6, 0x35, 0xb2, 0xb8, 0x83, 0x1e, 0x20, + 0x69, 0x87, 0x8f, 0xb5, 0x08, 0xc4, 0x82, 0xb1, 0x76, 0xec, 0xb5, 0xb1, 0x7c, 0xd9, 0xd7, 0x86, + 0x0c, 0x99, 0x13, 0x90, 0x9b, 0xa0, 0xea, 0xf4, 0x7d, 0x12, 0x8a, 0x75, 0xf7, 0xb8, 0x34, 0xde, + 0xd3, 0x76, 0x94, 0x22, 0x94, 0x82, 0xf5, 0x07, 0x5c, 0x90, 0x68, 0xdd, 0xd5, 0x53, 0x90, 0x29, + 0x58, 0xb2, 0x81, 0x32, 0x8c, 0xf9, 0x5b, 0x31, 0x3e, 0x10, 0x3d, 0xd2, 0x2d, 0x50, 0xf0, 0x5d, + 0x5d, 0x29, 0xd0, 0x8e, 0x85, 0xf5, 0x15, 0x54, 0xf0, 0xdd, 0x54, 0xe8, 0x8b, 0x67, 0x0a, 0xfd, + 0xc7, 0xa0, 0xee, 0xfa, 0x9c, 0xf5, 0xf1, 0x48, 0x1a, 0x95, 0x64, 0xd5, 0x3a, 0xff, 0xd7, 0xc0, + 0xfa, 0x4a, 0xb6, 0x85, 0xf2, 0xb8, 0xec, 0x1e, 0xcd, 0x5e, 0xf4, 0x1e, 0x3d, 0xc9, 0xdf, 0xa3, + 0x8a, 0x9a, 0x14, 0xfb, 0x62, 0xf7, 0x68, 0xc3, 0x77, 0x22, 0x7a, 0xb9, 0xcb, 0x54, 0x3d, 0xe7, + 0x32, 0x39, 0x00, 0x0c, 0x98, 0x8b, 0x05, 0x91, 0xb4, 0xcd, 0xda, 0xeb, 0x65, 0x93, 0xbe, 0x9a, + 0x76, 0x52, 0x2a, 0x94, 0xa3, 0x35, 0x7f, 0x2d, 0x80, 0xeb, 0xa7, 0x69, 0x2e, 0xfc, 0xd1, 0x00, + 0x55, 0x3d, 0xfa, 0xbc, 0x69, 0xa8, 0xeb, 0xbc, 0x33, 0xfd, 0x75, 0x3e, 0x25, 0x54, 0x36, 0x77, + 0x1a, 0xc3, 0x51, 0x1a, 0x18, 0x3e, 0x07, 0x15, 0x4e, 0x42, 0x4e, 0xa3, 0xe4, 0x39, 0xb2, 0x3d, + 0x45, 0x0e, 0x5d, 0xc5, 0x74, 0x5a, 0x0a, 0xe9, 0x21, 0xc4, 0x10, 0x8e, 0x92, 0xa8, 0xe6, 0x17, + 0xe0, 0x9d, 0x33, 0xdd, 0xce, 0x7f, 0xa2, 0x74, 0xac, 0x83, 0xa3, 0xf6, 0xcc, 0x8b, 0xa3, 0xf6, + 0xcc, 0xcb, 0xa3, 0xf6, 0xcc, 0x0f, 0xe3, 0xb6, 0x71, 0x30, 0x6e, 0x1b, 0x2f, 0xc6, 0x6d, 0xe3, + 0xe5, 0xb8, 0x6d, 0xfc, 0x3d, 0x6e, 0x1b, 0xbf, 0xfc, 0xd3, 0x9e, 0xf9, 0xb6, 0x9a, 0xa4, 0xf8, + 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xcc, 0xb0, 0x23, 0xde, 0x62, 0x0e, 0x00, 0x00, } diff --git a/pkg/apis/gateway/v1alpha1/generated.proto b/pkg/apis/gateway/v1alpha1/generated.proto index 59944b2c67..6b914fc968 100644 --- a/pkg/apis/gateway/v1alpha1/generated.proto +++ b/pkg/apis/gateway/v1alpha1/generated.proto @@ -19,7 +19,7 @@ syntax = 'proto2'; package github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1; -import "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1/generated.proto"; +import "github.com/argoproj/argo-events/pkg/apis/common/generated.proto"; import "k8s.io/api/core/v1/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; @@ -43,7 +43,6 @@ message EventProtocol { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // +k8s:openapi-gen=true message Gateway { - // +k8s:openapi-gen=false optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; optional GatewayStatus status = 2; @@ -54,7 +53,6 @@ message Gateway { // GatewayList is the list of Gateway resources // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object message GatewayList { - // +k8s:openapi-gen=false optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; repeated Gateway items = 2; @@ -159,7 +157,6 @@ message NodeStatus { optional string message = 8; // UpdateTime is the time when node(gateway configuration) was updated - // +k8s:openapi-gen=false optional k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime updateTime = 9; } diff --git a/pkg/apis/gateway/v1alpha1/openapi_generated.go b/pkg/apis/gateway/v1alpha1/openapi_generated.go index 440f202968..026b07b2a6 100644 --- a/pkg/apis/gateway/v1alpha1/openapi_generated.go +++ b/pkg/apis/gateway/v1alpha1/openapi_generated.go @@ -81,6 +81,25 @@ func schema_pkg_apis_gateway_v1alpha1_Gateway(ref common.ReferenceCallback) comm Description: "Gateway is the definition of a gateway resource", Type: []string{"object"}, Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), + }, + }, "status": { SchemaProps: spec.SchemaProps{ Ref: ref("github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.GatewayStatus"), @@ -92,11 +111,11 @@ func schema_pkg_apis_gateway_v1alpha1_Gateway(ref common.ReferenceCallback) comm }, }, }, - Required: []string{"status", "spec"}, + Required: []string{"metadata", "status", "spec"}, }, }, Dependencies: []string{ - "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.GatewaySpec", "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.GatewayStatus"}, + "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.GatewaySpec", "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.GatewayStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, } } @@ -107,6 +126,25 @@ func schema_pkg_apis_gateway_v1alpha1_GatewayList(ref common.ReferenceCallback) Description: "GatewayList is the list of Gateway resources", Type: []string{"object"}, Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), + }, + }, "items": { SchemaProps: spec.SchemaProps{ Type: []string{"array"}, @@ -120,11 +158,11 @@ func schema_pkg_apis_gateway_v1alpha1_GatewayList(ref common.ReferenceCallback) }, }, }, - Required: []string{"items"}, + Required: []string{"metadata", "items"}, }, }, Dependencies: []string{ - "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.Gateway"}, + "github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1.Gateway", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, } } @@ -381,11 +419,18 @@ func schema_pkg_apis_gateway_v1alpha1_NodeStatus(ref common.ReferenceCallback) c Format: "", }, }, + "updateTime": { + SchemaProps: spec.SchemaProps{ + Description: "UpdateTime is the time when node(gateway configuration) was updated", + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.MicroTime"), + }, + }, }, Required: []string{"id", "name", "displayName", "phase"}, }, }, - Dependencies: []string{}, + Dependencies: []string{ + "k8s.io/apimachinery/pkg/apis/meta/v1.MicroTime"}, } } diff --git a/pkg/apis/gateway/v1alpha1/types.go b/pkg/apis/gateway/v1alpha1/types.go index 0150de2495..ac8d9b9d64 100644 --- a/pkg/apis/gateway/v1alpha1/types.go +++ b/pkg/apis/gateway/v1alpha1/types.go @@ -17,7 +17,7 @@ limitations under the License. package v1alpha1 import ( - "github.com/argoproj/argo-events/pkg/common" + "github.com/argoproj/argo-events/pkg/apis/common" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -40,9 +40,7 @@ const ( // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // +k8s:openapi-gen=true type Gateway struct { - // +k8s:openapi-gen=false - metav1.TypeMeta `json:",inline"` - // +k8s:openapi-gen=false + metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata" protobuf:"bytes,1,opt,name=metadata"` Status GatewayStatus `json:"status" protobuf:"bytes,2,opt,name=status"` Spec GatewaySpec `json:"spec" protobuf:"bytes,3,opt,name=spec"` @@ -51,9 +49,7 @@ type Gateway struct { // GatewayList is the list of Gateway resources // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object type GatewayList struct { - // +k8s:openapi-gen=false metav1.TypeMeta `json:",inline"` - // +k8s:openapi-gen=false metav1.ListMeta `json:"metadata" protobuf:"bytes,1,opt,name=metadata"` Items []Gateway `json:"items" protobuf:"bytes,2,opt,name=items"` } @@ -130,7 +126,6 @@ type NodeStatus struct { Message string `json:"message,omitempty" protobuf:"bytes,8,opt,name=message"` // UpdateTime is the time when node(gateway configuration) was updated - // +k8s:openapi-gen=false UpdateTime metav1.MicroTime `json:"updateTime,omitempty" protobuf:"bytes,9,opt,name=updateTime"` } diff --git a/pkg/apis/sensor/v1alpha1/generated.pb.go b/pkg/apis/sensor/v1alpha1/generated.pb.go index dcba756144..9f44718bc6 100644 --- a/pkg/apis/sensor/v1alpha1/generated.pb.go +++ b/pkg/apis/sensor/v1alpha1/generated.pb.go @@ -20,11 +20,11 @@ package v1alpha1 import proto "github.com/gogo/protobuf/proto" import fmt "fmt" import math "math" +import common "github.com/argoproj/argo-events/pkg/apis/common" import v11 "k8s.io/api/core/v1" -import github_com_argoproj_argo_events_pkg_common "github.com/argoproj/argo-events/pkg/common" -import github_com_minio_minio_go "github.com/minio/minio-go" +import github_com_argoproj_argo_events_pkg_apis_common "github.com/argoproj/argo-events/pkg/apis/common" import github_com_gogo_protobuf_sortkeys "github.com/gogo/protobuf/sortkeys" @@ -47,7 +47,7 @@ const _ = proto.GoGoProtoPackageIsVersion2 // please upgrade the proto package func (m *ArtifactLocation) Reset() { *m = ArtifactLocation{} } func (*ArtifactLocation) ProtoMessage() {} func (*ArtifactLocation) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_9dc287890dc55c87, []int{0} + return fileDescriptor_generated_0e5510c518a7be9d, []int{0} } func (m *ArtifactLocation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -75,7 +75,7 @@ var xxx_messageInfo_ArtifactLocation proto.InternalMessageInfo func (m *ConfigmapArtifact) Reset() { *m = ConfigmapArtifact{} } func (*ConfigmapArtifact) ProtoMessage() {} func (*ConfigmapArtifact) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_9dc287890dc55c87, []int{1} + return fileDescriptor_generated_0e5510c518a7be9d, []int{1} } func (m *ConfigmapArtifact) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -103,7 +103,7 @@ var xxx_messageInfo_ConfigmapArtifact proto.InternalMessageInfo func (m *Data) Reset() { *m = Data{} } func (*Data) ProtoMessage() {} func (*Data) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_9dc287890dc55c87, []int{2} + return fileDescriptor_generated_0e5510c518a7be9d, []int{2} } func (m *Data) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -131,7 +131,7 @@ var xxx_messageInfo_Data proto.InternalMessageInfo func (m *DataFilter) Reset() { *m = DataFilter{} } func (*DataFilter) ProtoMessage() {} func (*DataFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_9dc287890dc55c87, []int{3} + return fileDescriptor_generated_0e5510c518a7be9d, []int{3} } func (m *DataFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -156,66 +156,10 @@ func (m *DataFilter) XXX_DiscardUnknown() { var xxx_messageInfo_DataFilter proto.InternalMessageInfo -func (m *Event) Reset() { *m = Event{} } -func (*Event) ProtoMessage() {} -func (*Event) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_9dc287890dc55c87, []int{4} -} -func (m *Event) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Event) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalTo(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (dst *Event) XXX_Merge(src proto.Message) { - xxx_messageInfo_Event.Merge(dst, src) -} -func (m *Event) XXX_Size() int { - return m.Size() -} -func (m *Event) XXX_DiscardUnknown() { - xxx_messageInfo_Event.DiscardUnknown(m) -} - -var xxx_messageInfo_Event proto.InternalMessageInfo - -func (m *EventContext) Reset() { *m = EventContext{} } -func (*EventContext) ProtoMessage() {} -func (*EventContext) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_9dc287890dc55c87, []int{5} -} -func (m *EventContext) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EventContext) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalTo(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (dst *EventContext) XXX_Merge(src proto.Message) { - xxx_messageInfo_EventContext.Merge(dst, src) -} -func (m *EventContext) XXX_Size() int { - return m.Size() -} -func (m *EventContext) XXX_DiscardUnknown() { - xxx_messageInfo_EventContext.DiscardUnknown(m) -} - -var xxx_messageInfo_EventContext proto.InternalMessageInfo - func (m *EventDependency) Reset() { *m = EventDependency{} } func (*EventDependency) ProtoMessage() {} func (*EventDependency) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_9dc287890dc55c87, []int{6} + return fileDescriptor_generated_0e5510c518a7be9d, []int{4} } func (m *EventDependency) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -243,7 +187,7 @@ var xxx_messageInfo_EventDependency proto.InternalMessageInfo func (m *EventDependencyFilter) Reset() { *m = EventDependencyFilter{} } func (*EventDependencyFilter) ProtoMessage() {} func (*EventDependencyFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_9dc287890dc55c87, []int{7} + return fileDescriptor_generated_0e5510c518a7be9d, []int{5} } func (m *EventDependencyFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -271,7 +215,7 @@ var xxx_messageInfo_EventDependencyFilter proto.InternalMessageInfo func (m *EventProtocol) Reset() { *m = EventProtocol{} } func (*EventProtocol) ProtoMessage() {} func (*EventProtocol) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_9dc287890dc55c87, []int{8} + return fileDescriptor_generated_0e5510c518a7be9d, []int{6} } func (m *EventProtocol) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -299,7 +243,7 @@ var xxx_messageInfo_EventProtocol proto.InternalMessageInfo func (m *FileArtifact) Reset() { *m = FileArtifact{} } func (*FileArtifact) ProtoMessage() {} func (*FileArtifact) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_9dc287890dc55c87, []int{9} + return fileDescriptor_generated_0e5510c518a7be9d, []int{7} } func (m *FileArtifact) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -327,7 +271,7 @@ var xxx_messageInfo_FileArtifact proto.InternalMessageInfo func (m *GroupVersionKind) Reset() { *m = GroupVersionKind{} } func (*GroupVersionKind) ProtoMessage() {} func (*GroupVersionKind) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_9dc287890dc55c87, []int{10} + return fileDescriptor_generated_0e5510c518a7be9d, []int{8} } func (m *GroupVersionKind) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -355,7 +299,7 @@ var xxx_messageInfo_GroupVersionKind proto.InternalMessageInfo func (m *Http) Reset() { *m = Http{} } func (*Http) ProtoMessage() {} func (*Http) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_9dc287890dc55c87, []int{11} + return fileDescriptor_generated_0e5510c518a7be9d, []int{9} } func (m *Http) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -383,7 +327,7 @@ var xxx_messageInfo_Http proto.InternalMessageInfo func (m *Nats) Reset() { *m = Nats{} } func (*Nats) ProtoMessage() {} func (*Nats) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_9dc287890dc55c87, []int{12} + return fileDescriptor_generated_0e5510c518a7be9d, []int{10} } func (m *Nats) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -411,7 +355,7 @@ var xxx_messageInfo_Nats proto.InternalMessageInfo func (m *NodeStatus) Reset() { *m = NodeStatus{} } func (*NodeStatus) ProtoMessage() {} func (*NodeStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_9dc287890dc55c87, []int{13} + return fileDescriptor_generated_0e5510c518a7be9d, []int{11} } func (m *NodeStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -439,7 +383,7 @@ var xxx_messageInfo_NodeStatus proto.InternalMessageInfo func (m *ResourceObject) Reset() { *m = ResourceObject{} } func (*ResourceObject) ProtoMessage() {} func (*ResourceObject) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_9dc287890dc55c87, []int{14} + return fileDescriptor_generated_0e5510c518a7be9d, []int{12} } func (m *ResourceObject) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -467,7 +411,7 @@ var xxx_messageInfo_ResourceObject proto.InternalMessageInfo func (m *ResourceParameter) Reset() { *m = ResourceParameter{} } func (*ResourceParameter) ProtoMessage() {} func (*ResourceParameter) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_9dc287890dc55c87, []int{15} + return fileDescriptor_generated_0e5510c518a7be9d, []int{13} } func (m *ResourceParameter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -495,7 +439,7 @@ var xxx_messageInfo_ResourceParameter proto.InternalMessageInfo func (m *ResourceParameterSource) Reset() { *m = ResourceParameterSource{} } func (*ResourceParameterSource) ProtoMessage() {} func (*ResourceParameterSource) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_9dc287890dc55c87, []int{16} + return fileDescriptor_generated_0e5510c518a7be9d, []int{14} } func (m *ResourceParameterSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -523,7 +467,7 @@ var xxx_messageInfo_ResourceParameterSource proto.InternalMessageInfo func (m *RetryStrategy) Reset() { *m = RetryStrategy{} } func (*RetryStrategy) ProtoMessage() {} func (*RetryStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_9dc287890dc55c87, []int{17} + return fileDescriptor_generated_0e5510c518a7be9d, []int{15} } func (m *RetryStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -548,94 +492,10 @@ func (m *RetryStrategy) XXX_DiscardUnknown() { var xxx_messageInfo_RetryStrategy proto.InternalMessageInfo -func (m *S3Artifact) Reset() { *m = S3Artifact{} } -func (*S3Artifact) ProtoMessage() {} -func (*S3Artifact) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_9dc287890dc55c87, []int{18} -} -func (m *S3Artifact) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *S3Artifact) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalTo(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (dst *S3Artifact) XXX_Merge(src proto.Message) { - xxx_messageInfo_S3Artifact.Merge(dst, src) -} -func (m *S3Artifact) XXX_Size() int { - return m.Size() -} -func (m *S3Artifact) XXX_DiscardUnknown() { - xxx_messageInfo_S3Artifact.DiscardUnknown(m) -} - -var xxx_messageInfo_S3Artifact proto.InternalMessageInfo - -func (m *S3Bucket) Reset() { *m = S3Bucket{} } -func (*S3Bucket) ProtoMessage() {} -func (*S3Bucket) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_9dc287890dc55c87, []int{19} -} -func (m *S3Bucket) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *S3Bucket) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalTo(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (dst *S3Bucket) XXX_Merge(src proto.Message) { - xxx_messageInfo_S3Bucket.Merge(dst, src) -} -func (m *S3Bucket) XXX_Size() int { - return m.Size() -} -func (m *S3Bucket) XXX_DiscardUnknown() { - xxx_messageInfo_S3Bucket.DiscardUnknown(m) -} - -var xxx_messageInfo_S3Bucket proto.InternalMessageInfo - -func (m *S3Filter) Reset() { *m = S3Filter{} } -func (*S3Filter) ProtoMessage() {} -func (*S3Filter) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_9dc287890dc55c87, []int{20} -} -func (m *S3Filter) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *S3Filter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalTo(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (dst *S3Filter) XXX_Merge(src proto.Message) { - xxx_messageInfo_S3Filter.Merge(dst, src) -} -func (m *S3Filter) XXX_Size() int { - return m.Size() -} -func (m *S3Filter) XXX_DiscardUnknown() { - xxx_messageInfo_S3Filter.DiscardUnknown(m) -} - -var xxx_messageInfo_S3Filter proto.InternalMessageInfo - func (m *Sensor) Reset() { *m = Sensor{} } func (*Sensor) ProtoMessage() {} func (*Sensor) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_9dc287890dc55c87, []int{21} + return fileDescriptor_generated_0e5510c518a7be9d, []int{16} } func (m *Sensor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -663,7 +523,7 @@ var xxx_messageInfo_Sensor proto.InternalMessageInfo func (m *SensorList) Reset() { *m = SensorList{} } func (*SensorList) ProtoMessage() {} func (*SensorList) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_9dc287890dc55c87, []int{22} + return fileDescriptor_generated_0e5510c518a7be9d, []int{17} } func (m *SensorList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -691,7 +551,7 @@ var xxx_messageInfo_SensorList proto.InternalMessageInfo func (m *SensorSpec) Reset() { *m = SensorSpec{} } func (*SensorSpec) ProtoMessage() {} func (*SensorSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_9dc287890dc55c87, []int{23} + return fileDescriptor_generated_0e5510c518a7be9d, []int{18} } func (m *SensorSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -719,7 +579,7 @@ var xxx_messageInfo_SensorSpec proto.InternalMessageInfo func (m *SensorStatus) Reset() { *m = SensorStatus{} } func (*SensorStatus) ProtoMessage() {} func (*SensorStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_9dc287890dc55c87, []int{24} + return fileDescriptor_generated_0e5510c518a7be9d, []int{19} } func (m *SensorStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -747,7 +607,7 @@ var xxx_messageInfo_SensorStatus proto.InternalMessageInfo func (m *TimeFilter) Reset() { *m = TimeFilter{} } func (*TimeFilter) ProtoMessage() {} func (*TimeFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_9dc287890dc55c87, []int{25} + return fileDescriptor_generated_0e5510c518a7be9d, []int{20} } func (m *TimeFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -775,7 +635,7 @@ var xxx_messageInfo_TimeFilter proto.InternalMessageInfo func (m *Trigger) Reset() { *m = Trigger{} } func (*Trigger) ProtoMessage() {} func (*Trigger) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_9dc287890dc55c87, []int{26} + return fileDescriptor_generated_0e5510c518a7be9d, []int{21} } func (m *Trigger) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -800,38 +660,10 @@ func (m *Trigger) XXX_DiscardUnknown() { var xxx_messageInfo_Trigger proto.InternalMessageInfo -func (m *URI) Reset() { *m = URI{} } -func (*URI) ProtoMessage() {} -func (*URI) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_9dc287890dc55c87, []int{27} -} -func (m *URI) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *URI) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalTo(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (dst *URI) XXX_Merge(src proto.Message) { - xxx_messageInfo_URI.Merge(dst, src) -} -func (m *URI) XXX_Size() int { - return m.Size() -} -func (m *URI) XXX_DiscardUnknown() { - xxx_messageInfo_URI.DiscardUnknown(m) -} - -var xxx_messageInfo_URI proto.InternalMessageInfo - func (m *URLArtifact) Reset() { *m = URLArtifact{} } func (*URLArtifact) ProtoMessage() {} func (*URLArtifact) Descriptor() ([]byte, []int) { - return fileDescriptor_generated_9dc287890dc55c87, []int{28} + return fileDescriptor_generated_0e5510c518a7be9d, []int{22} } func (m *URLArtifact) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -861,9 +693,6 @@ func init() { proto.RegisterType((*ConfigmapArtifact)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.ConfigmapArtifact") proto.RegisterType((*Data)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.Data") proto.RegisterType((*DataFilter)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.DataFilter") - proto.RegisterType((*Event)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.Event") - proto.RegisterType((*EventContext)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.EventContext") - proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.EventContext.ExtensionsEntry") proto.RegisterType((*EventDependency)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.EventDependency") proto.RegisterType((*EventDependencyFilter)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.EventDependencyFilter") proto.RegisterType((*EventProtocol)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.EventProtocol") @@ -877,9 +706,6 @@ func init() { proto.RegisterType((*ResourceParameter)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.ResourceParameter") proto.RegisterType((*ResourceParameterSource)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.ResourceParameterSource") proto.RegisterType((*RetryStrategy)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.RetryStrategy") - proto.RegisterType((*S3Artifact)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.S3Artifact") - proto.RegisterType((*S3Bucket)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.S3Bucket") - proto.RegisterType((*S3Filter)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.S3Filter") proto.RegisterType((*Sensor)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.Sensor") proto.RegisterType((*SensorList)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.SensorList") proto.RegisterType((*SensorSpec)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.SensorSpec") @@ -887,7 +713,6 @@ func init() { proto.RegisterMapType((map[string]NodeStatus)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.SensorStatus.NodesEntry") proto.RegisterType((*TimeFilter)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.TimeFilter") proto.RegisterType((*Trigger)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.Trigger") - proto.RegisterType((*URI)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.URI") proto.RegisterType((*URLArtifact)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.URLArtifact") } func (m *ArtifactLocation) Marshal() (dAtA []byte, err error) { @@ -1044,126 +869,6 @@ func (m *DataFilter) MarshalTo(dAtA []byte) (int, error) { return i, nil } -func (m *Event) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Event) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i - var l int - _ = l - dAtA[i] = 0xa - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Context.Size())) - n5, err := m.Context.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n5 - if m.Payload != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Payload))) - i += copy(dAtA[i:], m.Payload) - } - return i, nil -} - -func (m *EventContext) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EventContext) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i - var l int - _ = l - dAtA[i] = 0xa - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.EventType))) - i += copy(dAtA[i:], m.EventType) - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.EventTypeVersion))) - i += copy(dAtA[i:], m.EventTypeVersion) - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.CloudEventsVersion))) - i += copy(dAtA[i:], m.CloudEventsVersion) - if m.Source != nil { - dAtA[i] = 0x22 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Source.Size())) - n6, err := m.Source.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n6 - } - dAtA[i] = 0x2a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.EventID))) - i += copy(dAtA[i:], m.EventID) - dAtA[i] = 0x32 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.EventTime.Size())) - n7, err := m.EventTime.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n7 - if m.SchemaURL != nil { - dAtA[i] = 0x3a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.SchemaURL.Size())) - n8, err := m.SchemaURL.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n8 - } - dAtA[i] = 0x42 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.ContentType))) - i += copy(dAtA[i:], m.ContentType) - if len(m.Extensions) > 0 { - keysForExtensions := make([]string, 0, len(m.Extensions)) - for k := range m.Extensions { - keysForExtensions = append(keysForExtensions, string(k)) - } - github_com_gogo_protobuf_sortkeys.Strings(keysForExtensions) - for _, k := range keysForExtensions { - dAtA[i] = 0x4a - i++ - v := m.Extensions[string(k)] - mapSize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + len(v) + sovGenerated(uint64(len(v))) - i = encodeVarintGenerated(dAtA, i, uint64(mapSize)) - dAtA[i] = 0xa - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(k))) - i += copy(dAtA[i:], k) - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(v))) - i += copy(dAtA[i:], v) - } - } - return i, nil -} - func (m *EventDependency) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1189,11 +894,11 @@ func (m *EventDependency) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Filters.Size())) - n9, err := m.Filters.MarshalTo(dAtA[i:]) + n5, err := m.Filters.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n9 + i += n5 dAtA[i] = 0x20 i++ if m.Connected { @@ -1228,31 +933,31 @@ func (m *EventDependencyFilter) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Time.Size())) - n10, err := m.Time.MarshalTo(dAtA[i:]) + n6, err := m.Time.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n10 + i += n6 } if m.Context != nil { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Context.Size())) - n11, err := m.Context.MarshalTo(dAtA[i:]) + n7, err := m.Context.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n11 + i += n7 } if m.Data != nil { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Data.Size())) - n12, err := m.Data.MarshalTo(dAtA[i:]) + n8, err := m.Data.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n12 + i += n8 } return i, nil } @@ -1279,19 +984,19 @@ func (m *EventProtocol) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Http.Size())) - n13, err := m.Http.MarshalTo(dAtA[i:]) + n9, err := m.Http.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n13 + i += n9 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Nats.Size())) - n14, err := m.Nats.MarshalTo(dAtA[i:]) + n10, err := m.Nats.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n14 + i += n10 return i, nil } @@ -1477,19 +1182,19 @@ func (m *NodeStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x32 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StartedAt.Size())) - n15, err := m.StartedAt.MarshalTo(dAtA[i:]) + n11, err := m.StartedAt.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n15 + i += n11 dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.CompletedAt.Size())) - n16, err := m.CompletedAt.MarshalTo(dAtA[i:]) + n12, err := m.CompletedAt.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n16 + i += n12 dAtA[i] = 0x42 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Message))) @@ -1498,11 +1203,11 @@ func (m *NodeStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x4a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Event.Size())) - n17, err := m.Event.MarshalTo(dAtA[i:]) + n13, err := m.Event.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n17 + i += n13 } return i, nil } @@ -1563,19 +1268,19 @@ func (m *ResourceObject) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.GroupVersionKind.Size())) - n18, err := m.GroupVersionKind.MarshalTo(dAtA[i:]) + n14, err := m.GroupVersionKind.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n18 + i += n14 dAtA[i] = 0x32 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Source.Size())) - n19, err := m.Source.MarshalTo(dAtA[i:]) + n15, err := m.Source.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n19 + i += n15 return i, nil } @@ -1598,11 +1303,11 @@ func (m *ResourceParameter) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Src.Size())) - n20, err := m.Src.MarshalTo(dAtA[i:]) + n16, err := m.Src.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n20 + i += n16 } dAtA[i] = 0x12 i++ @@ -1661,7 +1366,7 @@ func (m *RetryStrategy) MarshalTo(dAtA []byte) (int, error) { return i, nil } -func (m *S3Artifact) Marshal() (dAtA []byte, err error) { +func (m *Sensor) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalTo(dAtA) @@ -1671,43 +1376,39 @@ func (m *S3Artifact) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *S3Artifact) MarshalTo(dAtA []byte) (int, error) { +func (m *Sensor) MarshalTo(dAtA []byte) (int, error) { var i int _ = i var l int _ = l dAtA[i] = 0xa i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Key))) - i += copy(dAtA[i:], m.Key) + i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) + n17, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n17 dAtA[i] = 0x12 i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Event))) - i += copy(dAtA[i:], m.Event) - if m.Filter != nil { - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Filter.Size())) - n21, err := m.Filter.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n21 + i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) + n18, err := m.Spec.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err } - if m.S3Bucket != nil { - dAtA[i] = 0x22 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.S3Bucket.Size())) - n22, err := m.S3Bucket.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n22 + i += n18 + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) + n19, err := m.Status.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err } + i += n19 return i, nil } -func (m *S3Bucket) Marshal() (dAtA []byte, err error) { +func (m *SensorList) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalTo(dAtA) @@ -1717,155 +1418,29 @@ func (m *S3Bucket) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *S3Bucket) MarshalTo(dAtA []byte) (int, error) { +func (m *SensorList) MarshalTo(dAtA []byte) (int, error) { var i int _ = i var l int _ = l dAtA[i] = 0xa i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Endpoint))) - i += copy(dAtA[i:], m.Endpoint) - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Bucket))) - i += copy(dAtA[i:], m.Bucket) - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Region))) - i += copy(dAtA[i:], m.Region) - dAtA[i] = 0x20 - i++ - if m.Insecure { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i++ - if m.AccessKey != nil { - dAtA[i] = 0x2a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.AccessKey.Size())) - n23, err := m.AccessKey.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n23 + i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) + n20, err := m.ListMeta.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err } - if m.SecretKey != nil { - dAtA[i] = 0x32 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.SecretKey.Size())) - n24, err := m.SecretKey.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n24 - } - return i, nil -} - -func (m *S3Filter) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *S3Filter) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i - var l int - _ = l - dAtA[i] = 0xa - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Prefix))) - i += copy(dAtA[i:], m.Prefix) - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Suffix))) - i += copy(dAtA[i:], m.Suffix) - return i, nil -} - -func (m *Sensor) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Sensor) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i - var l int - _ = l - dAtA[i] = 0xa - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n25, err := m.ObjectMeta.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n25 - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n26, err := m.Spec.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n26 - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n27, err := m.Status.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n27 - return i, nil -} - -func (m *SensorList) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SensorList) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i - var l int - _ = l - dAtA[i] = 0xa - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n28, err := m.ListMeta.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n28 - if len(m.Items) > 0 { - for _, msg := range m.Items { - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n + i += n20 + if len(m.Items) > 0 { + for _, msg := range m.Items { + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n } } return i, nil @@ -1914,21 +1489,21 @@ func (m *SensorSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.DeploySpec.Size())) - n29, err := m.DeploySpec.MarshalTo(dAtA[i:]) + n21, err := m.DeploySpec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n29 + i += n21 } if m.EventProtocol != nil { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.EventProtocol.Size())) - n30, err := m.EventProtocol.MarshalTo(dAtA[i:]) + n22, err := m.EventProtocol.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n30 + i += n22 } return i, nil } @@ -1955,19 +1530,19 @@ func (m *SensorStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StartedAt.Size())) - n31, err := m.StartedAt.MarshalTo(dAtA[i:]) + n23, err := m.StartedAt.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n31 + i += n23 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.CompletedAt.Size())) - n32, err := m.CompletedAt.MarshalTo(dAtA[i:]) + n24, err := m.CompletedAt.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n32 + i += n24 dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Message))) @@ -1996,11 +1571,11 @@ func (m *SensorStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n33, err := (&v).MarshalTo(dAtA[i:]) + n25, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n33 + i += n25 } } dAtA[i] = 0x30 @@ -2058,11 +1633,11 @@ func (m *Trigger) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Resource.Size())) - n34, err := m.Resource.MarshalTo(dAtA[i:]) + n26, err := m.Resource.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n34 + i += n26 } dAtA[i] = 0x1a i++ @@ -2072,61 +1647,12 @@ func (m *Trigger) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.RetryStrategy.Size())) - n35, err := m.RetryStrategy.MarshalTo(dAtA[i:]) + n27, err := m.RetryStrategy.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n35 - } - return i, nil -} - -func (m *URI) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) - if err != nil { - return nil, err + i += n27 } - return dAtA[:n], nil -} - -func (m *URI) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i - var l int - _ = l - dAtA[i] = 0xa - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Scheme))) - i += copy(dAtA[i:], m.Scheme) - dAtA[i] = 0x12 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.User))) - i += copy(dAtA[i:], m.User) - dAtA[i] = 0x1a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Password))) - i += copy(dAtA[i:], m.Password) - dAtA[i] = 0x22 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Host))) - i += copy(dAtA[i:], m.Host) - dAtA[i] = 0x28 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(m.Port)) - dAtA[i] = 0x32 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Path))) - i += copy(dAtA[i:], m.Path) - dAtA[i] = 0x3a - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Query))) - i += copy(dAtA[i:], m.Query) - dAtA[i] = 0x42 - i++ - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Fragment))) - i += copy(dAtA[i:], m.Fragment) return i, nil } @@ -2243,58 +1769,6 @@ func (m *DataFilter) Size() (n int) { return n } -func (m *Event) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Context.Size() - n += 1 + l + sovGenerated(uint64(l)) - if m.Payload != nil { - l = len(m.Payload) - n += 1 + l + sovGenerated(uint64(l)) - } - return n -} - -func (m *EventContext) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.EventType) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.EventTypeVersion) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.CloudEventsVersion) - n += 1 + l + sovGenerated(uint64(l)) - if m.Source != nil { - l = m.Source.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - l = len(m.EventID) - n += 1 + l + sovGenerated(uint64(l)) - l = m.EventTime.Size() - n += 1 + l + sovGenerated(uint64(l)) - if m.SchemaURL != nil { - l = m.SchemaURL.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - l = len(m.ContentType) - n += 1 + l + sovGenerated(uint64(l)) - if len(m.Extensions) > 0 { - for k, v := range m.Extensions { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + len(v) + sovGenerated(uint64(len(v))) - n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) - } - } - return n -} - func (m *EventDependency) Size() (n int) { if m == nil { return 0 @@ -2510,64 +1984,6 @@ func (m *RetryStrategy) Size() (n int) { return n } -func (m *S3Artifact) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Key) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Event) - n += 1 + l + sovGenerated(uint64(l)) - if m.Filter != nil { - l = m.Filter.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - if m.S3Bucket != nil { - l = m.S3Bucket.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - return n -} - -func (m *S3Bucket) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Endpoint) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Bucket) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Region) - n += 1 + l + sovGenerated(uint64(l)) - n += 2 - if m.AccessKey != nil { - l = m.AccessKey.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - if m.SecretKey != nil { - l = m.SecretKey.Size() - n += 1 + l + sovGenerated(uint64(l)) - } - return n -} - -func (m *S3Filter) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Prefix) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Suffix) - n += 1 + l + sovGenerated(uint64(l)) - return n -} - func (m *Sensor) Size() (n int) { if m == nil { return 0 @@ -2690,30 +2106,6 @@ func (m *Trigger) Size() (n int) { return n } -func (m *URI) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Scheme) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.User) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Password) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Host) - n += 1 + l + sovGenerated(uint64(l)) - n += 1 + sovGenerated(uint64(m.Port)) - l = len(m.Path) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Query) - n += 1 + l + sovGenerated(uint64(l)) - l = len(m.Fragment) - n += 1 + l + sovGenerated(uint64(l)) - return n -} - func (m *URLArtifact) Size() (n int) { if m == nil { return 0 @@ -2744,7 +2136,7 @@ func (this *ArtifactLocation) String() string { return "nil" } s := strings.Join([]string{`&ArtifactLocation{`, - `S3:` + strings.Replace(fmt.Sprintf("%v", this.S3), "S3Artifact", "S3Artifact", 1) + `,`, + `S3:` + strings.Replace(fmt.Sprintf("%v", this.S3), "S3Artifact", "common.S3Artifact", 1) + `,`, `Inline:` + valueToStringGenerated(this.Inline) + `,`, `File:` + strings.Replace(fmt.Sprintf("%v", this.File), "FileArtifact", "FileArtifact", 1) + `,`, `URL:` + strings.Replace(fmt.Sprintf("%v", this.URL), "URLArtifact", "URLArtifact", 1) + `,`, @@ -2787,45 +2179,6 @@ func (this *DataFilter) String() string { }, "") return s } -func (this *Event) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&Event{`, - `Context:` + strings.Replace(strings.Replace(this.Context.String(), "EventContext", "EventContext", 1), `&`, ``, 1) + `,`, - `Payload:` + valueToStringGenerated(this.Payload) + `,`, - `}`, - }, "") - return s -} -func (this *EventContext) String() string { - if this == nil { - return "nil" - } - keysForExtensions := make([]string, 0, len(this.Extensions)) - for k := range this.Extensions { - keysForExtensions = append(keysForExtensions, k) - } - github_com_gogo_protobuf_sortkeys.Strings(keysForExtensions) - mapStringForExtensions := "map[string]string{" - for _, k := range keysForExtensions { - mapStringForExtensions += fmt.Sprintf("%v: %v,", k, this.Extensions[k]) - } - mapStringForExtensions += "}" - s := strings.Join([]string{`&EventContext{`, - `EventType:` + fmt.Sprintf("%v", this.EventType) + `,`, - `EventTypeVersion:` + fmt.Sprintf("%v", this.EventTypeVersion) + `,`, - `CloudEventsVersion:` + fmt.Sprintf("%v", this.CloudEventsVersion) + `,`, - `Source:` + strings.Replace(fmt.Sprintf("%v", this.Source), "URI", "URI", 1) + `,`, - `EventID:` + fmt.Sprintf("%v", this.EventID) + `,`, - `EventTime:` + strings.Replace(strings.Replace(this.EventTime.String(), "MicroTime", "v1.MicroTime", 1), `&`, ``, 1) + `,`, - `SchemaURL:` + strings.Replace(fmt.Sprintf("%v", this.SchemaURL), "URI", "URI", 1) + `,`, - `ContentType:` + fmt.Sprintf("%v", this.ContentType) + `,`, - `Extensions:` + mapStringForExtensions + `,`, - `}`, - }, "") - return s -} func (this *EventDependency) String() string { if this == nil { return "nil" @@ -2846,7 +2199,7 @@ func (this *EventDependencyFilter) String() string { s := strings.Join([]string{`&EventDependencyFilter{`, `Name:` + fmt.Sprintf("%v", this.Name) + `,`, `Time:` + strings.Replace(fmt.Sprintf("%v", this.Time), "TimeFilter", "TimeFilter", 1) + `,`, - `Context:` + strings.Replace(fmt.Sprintf("%v", this.Context), "EventContext", "EventContext", 1) + `,`, + `Context:` + strings.Replace(fmt.Sprintf("%v", this.Context), "EventContext", "common.EventContext", 1) + `,`, `Data:` + strings.Replace(fmt.Sprintf("%v", this.Data), "Data", "Data", 1) + `,`, `}`, }, "") @@ -2928,7 +2281,7 @@ func (this *NodeStatus) String() string { `StartedAt:` + strings.Replace(strings.Replace(this.StartedAt.String(), "MicroTime", "v1.MicroTime", 1), `&`, ``, 1) + `,`, `CompletedAt:` + strings.Replace(strings.Replace(this.CompletedAt.String(), "MicroTime", "v1.MicroTime", 1), `&`, ``, 1) + `,`, `Message:` + fmt.Sprintf("%v", this.Message) + `,`, - `Event:` + strings.Replace(fmt.Sprintf("%v", this.Event), "Event", "Event", 1) + `,`, + `Event:` + strings.Replace(fmt.Sprintf("%v", this.Event), "Event", "common.Event", 1) + `,`, `}`, }, "") return s @@ -2989,82 +2342,43 @@ func (this *RetryStrategy) String() string { }, "") return s } -func (this *S3Artifact) String() string { +func (this *Sensor) String() string { if this == nil { return "nil" } - s := strings.Join([]string{`&S3Artifact{`, - `Key:` + fmt.Sprintf("%v", this.Key) + `,`, - `Event:` + fmt.Sprintf("%v", this.Event) + `,`, - `Filter:` + strings.Replace(fmt.Sprintf("%v", this.Filter), "S3Filter", "S3Filter", 1) + `,`, - `S3Bucket:` + strings.Replace(fmt.Sprintf("%v", this.S3Bucket), "S3Bucket", "S3Bucket", 1) + `,`, + s := strings.Join([]string{`&Sensor{`, + `ObjectMeta:` + strings.Replace(strings.Replace(this.ObjectMeta.String(), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "SensorSpec", "SensorSpec", 1), `&`, ``, 1) + `,`, + `Status:` + strings.Replace(strings.Replace(this.Status.String(), "SensorStatus", "SensorStatus", 1), `&`, ``, 1) + `,`, `}`, }, "") return s } -func (this *S3Bucket) String() string { +func (this *SensorList) String() string { if this == nil { return "nil" } - s := strings.Join([]string{`&S3Bucket{`, - `Endpoint:` + fmt.Sprintf("%v", this.Endpoint) + `,`, - `Bucket:` + fmt.Sprintf("%v", this.Bucket) + `,`, - `Region:` + fmt.Sprintf("%v", this.Region) + `,`, - `Insecure:` + fmt.Sprintf("%v", this.Insecure) + `,`, - `AccessKey:` + strings.Replace(fmt.Sprintf("%v", this.AccessKey), "SecretKeySelector", "v11.SecretKeySelector", 1) + `,`, - `SecretKey:` + strings.Replace(fmt.Sprintf("%v", this.SecretKey), "SecretKeySelector", "v11.SecretKeySelector", 1) + `,`, + s := strings.Join([]string{`&SensorList{`, + `ListMeta:` + strings.Replace(strings.Replace(this.ListMeta.String(), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Items), "Sensor", "Sensor", 1), `&`, ``, 1) + `,`, `}`, }, "") return s } -func (this *S3Filter) String() string { +func (this *SensorSpec) String() string { if this == nil { return "nil" } - s := strings.Join([]string{`&S3Filter{`, - `Prefix:` + fmt.Sprintf("%v", this.Prefix) + `,`, - `Suffix:` + fmt.Sprintf("%v", this.Suffix) + `,`, + s := strings.Join([]string{`&SensorSpec{`, + `Dependencies:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Dependencies), "EventDependency", "EventDependency", 1), `&`, ``, 1) + `,`, + `Triggers:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Triggers), "Trigger", "Trigger", 1), `&`, ``, 1) + `,`, + `DeploySpec:` + strings.Replace(fmt.Sprintf("%v", this.DeploySpec), "PodSpec", "v11.PodSpec", 1) + `,`, + `EventProtocol:` + strings.Replace(fmt.Sprintf("%v", this.EventProtocol), "EventProtocol", "EventProtocol", 1) + `,`, `}`, }, "") return s } -func (this *Sensor) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&Sensor{`, - `ObjectMeta:` + strings.Replace(strings.Replace(this.ObjectMeta.String(), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, - `Spec:` + strings.Replace(strings.Replace(this.Spec.String(), "SensorSpec", "SensorSpec", 1), `&`, ``, 1) + `,`, - `Status:` + strings.Replace(strings.Replace(this.Status.String(), "SensorStatus", "SensorStatus", 1), `&`, ``, 1) + `,`, - `}`, - }, "") - return s -} -func (this *SensorList) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&SensorList{`, - `ListMeta:` + strings.Replace(strings.Replace(this.ListMeta.String(), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, - `Items:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Items), "Sensor", "Sensor", 1), `&`, ``, 1) + `,`, - `}`, - }, "") - return s -} -func (this *SensorSpec) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&SensorSpec{`, - `Dependencies:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Dependencies), "EventDependency", "EventDependency", 1), `&`, ``, 1) + `,`, - `Triggers:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Triggers), "Trigger", "Trigger", 1), `&`, ``, 1) + `,`, - `DeploySpec:` + strings.Replace(fmt.Sprintf("%v", this.DeploySpec), "PodSpec", "v11.PodSpec", 1) + `,`, - `EventProtocol:` + strings.Replace(fmt.Sprintf("%v", this.EventProtocol), "EventProtocol", "EventProtocol", 1) + `,`, - `}`, - }, "") - return s -} -func (this *SensorStatus) String() string { +func (this *SensorStatus) String() string { if this == nil { return "nil" } @@ -3113,23 +2427,6 @@ func (this *Trigger) String() string { }, "") return s } -func (this *URI) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&URI{`, - `Scheme:` + fmt.Sprintf("%v", this.Scheme) + `,`, - `User:` + fmt.Sprintf("%v", this.User) + `,`, - `Password:` + fmt.Sprintf("%v", this.Password) + `,`, - `Host:` + fmt.Sprintf("%v", this.Host) + `,`, - `Port:` + fmt.Sprintf("%v", this.Port) + `,`, - `Path:` + fmt.Sprintf("%v", this.Path) + `,`, - `Query:` + fmt.Sprintf("%v", this.Query) + `,`, - `Fragment:` + fmt.Sprintf("%v", this.Fragment) + `,`, - `}`, - }, "") - return s -} func (this *URLArtifact) String() string { if this == nil { return "nil" @@ -3205,7 +2502,7 @@ func (m *ArtifactLocation) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.S3 == nil { - m.S3 = &S3Artifact{} + m.S3 = &common.S3Artifact{} } if err := m.S3.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -3716,7 +3013,7 @@ func (m *DataFilter) Unmarshal(dAtA []byte) error { } return nil } -func (m *Event) Unmarshal(dAtA []byte) error { +func (m *EventDependency) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3739,17 +3036,17 @@ func (m *Event) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Event: wiretype end group for non-group") + return fmt.Errorf("proto: EventDependency: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Event: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: EventDependency: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Context", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -3759,27 +3056,45 @@ func (m *Event) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= (int(b) & 0x7F) << shift + stringLen |= (uint64(b) & 0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Context.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Name = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Deadline", wireType) + } + m.Deadline = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Deadline |= (int64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Payload", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Filters", wireType) } - var byteLen int + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -3789,23 +3104,42 @@ func (m *Event) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= (int(b) & 0x7F) << shift + msglen |= (int(b) & 0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + byteLen + postIndex := iNdEx + msglen if postIndex > l { return io.ErrUnexpectedEOF } - m.Payload = append(m.Payload[:0], dAtA[iNdEx:postIndex]...) - if m.Payload == nil { - m.Payload = []byte{} + if err := m.Filters.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Connected", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.Connected = bool(v != 0) default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -3827,7 +3161,7 @@ func (m *Event) Unmarshal(dAtA []byte) error { } return nil } -func (m *EventContext) Unmarshal(dAtA []byte) error { +func (m *EventDependencyFilter) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3850,15 +3184,15 @@ func (m *EventContext) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: EventContext: wiretype end group for non-group") + return fmt.Errorf("proto: EventDependencyFilter: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: EventContext: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: EventDependencyFilter: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EventType", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -3883,13 +3217,13 @@ func (m *EventContext) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.EventType = string(dAtA[iNdEx:postIndex]) + m.Name = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EventTypeVersion", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Time", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -3899,26 +3233,30 @@ func (m *EventContext) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift + msglen |= (int(b) & 0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex > l { return io.ErrUnexpectedEOF } - m.EventTypeVersion = string(dAtA[iNdEx:postIndex]) + if m.Time == nil { + m.Time = &TimeFilter{} + } + if err := m.Time.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CloudEventsVersion", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Context", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -3928,24 +3266,28 @@ func (m *EventContext) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift + msglen |= (int(b) & 0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex > l { return io.ErrUnexpectedEOF } - m.CloudEventsVersion = string(dAtA[iNdEx:postIndex]) + if m.Context == nil { + m.Context = &common.EventContext{} + } + if err := m.Context.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Source", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -3969,16 +3311,66 @@ func (m *EventContext) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Source == nil { - m.Source = &URI{} + if m.Data == nil { + m.Data = &Data{} } - if err := m.Source.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Data.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 5: + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EventProtocol) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EventProtocol: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EventProtocol: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EventID", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -4003,11 +3395,11 @@ func (m *EventContext) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.EventID = string(dAtA[iNdEx:postIndex]) + m.Type = github_com_argoproj_argo_events_pkg_apis_common.EventProtocolType(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 6: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EventTime", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Http", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -4031,13 +3423,13 @@ func (m *EventContext) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.EventTime.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Http.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 7: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SchemaURL", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Nats", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -4061,159 +3453,88 @@ func (m *EventContext) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.SchemaURL == nil { - m.SchemaURL = &URI{} - } - if err := m.SchemaURL.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Nats.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ContentType", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err } - intStringLen := int(stringLen) - if intStringLen < 0 { + if skippy < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen - if postIndex > l { + if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } - m.ContentType = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Extensions", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *FileArtifact) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated } - postIndex := iNdEx + msglen - if postIndex > l { + if iNdEx >= l { return io.ErrUnexpectedEOF } - if m.Extensions == nil { - m.Extensions = make(map[string]string) + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break } - var mapkey string - var mapvalue string - for iNdEx < postIndex { - entryPreIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: FileArtifact: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: FileArtifact: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated } - fieldNum := int32(wire >> 3) - if fieldNum == 1 { - var stringLenmapkey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapkey |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapkey := int(stringLenmapkey) - if intStringLenmapkey < 0 { - return ErrInvalidLengthGenerated - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey > l { - return io.ErrUnexpectedEOF - } - mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) - iNdEx = postStringIndexmapkey - } else if fieldNum == 2 { - var stringLenmapvalue uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapvalue |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapvalue := int(stringLenmapvalue) - if intStringLenmapvalue < 0 { - return ErrInvalidLengthGenerated - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break } } - m.Extensions[mapkey] = mapvalue + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Path = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -4236,7 +3557,7 @@ func (m *EventContext) Unmarshal(dAtA []byte) error { } return nil } -func (m *EventDependency) Unmarshal(dAtA []byte) error { +func (m *GroupVersionKind) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -4259,15 +3580,15 @@ func (m *EventDependency) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: EventDependency: wiretype end group for non-group") + return fmt.Errorf("proto: GroupVersionKind: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: EventDependency: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GroupVersionKind: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Group", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -4292,13 +3613,13 @@ func (m *EventDependency) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Name = string(dAtA[iNdEx:postIndex]) + m.Group = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Deadline", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) } - m.Deadline = 0 + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -4308,16 +3629,26 @@ func (m *EventDependency) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Deadline |= (int64(b) & 0x7F) << shift + stringLen |= (uint64(b) & 0x7F) << shift if b < 0x80 { break } } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Version = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Filters", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -4327,42 +3658,21 @@ func (m *EventDependency) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= (int(b) & 0x7F) << shift + stringLen |= (uint64(b) & 0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Filters.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Kind = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Connected", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - m.Connected = bool(v != 0) default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -4384,7 +3694,7 @@ func (m *EventDependency) Unmarshal(dAtA []byte) error { } return nil } -func (m *EventDependencyFilter) Unmarshal(dAtA []byte) error { +func (m *Http) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -4407,15 +3717,15 @@ func (m *EventDependencyFilter) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: EventDependencyFilter: wiretype end group for non-group") + return fmt.Errorf("proto: Http: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: EventDependencyFilter: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Http: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Port", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -4440,117 +3750,18 @@ func (m *EventDependencyFilter) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Name = string(dAtA[iNdEx:postIndex]) + m.Port = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Time", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err } - if msglen < 0 { + if skippy < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Time == nil { - m.Time = &TimeFilter{} - } - if err := m.Time.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Context", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Context == nil { - m.Context = &EventContext{} - } - if err := m.Context.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Data == nil { - m.Data = &Data{} - } - if err := m.Data.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { + if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } iNdEx += skippy @@ -4562,7 +3773,7 @@ func (m *EventDependencyFilter) Unmarshal(dAtA []byte) error { } return nil } -func (m *EventProtocol) Unmarshal(dAtA []byte) error { +func (m *Nats) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -4585,15 +3796,15 @@ func (m *EventProtocol) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: EventProtocol: wiretype end group for non-group") + return fmt.Errorf("proto: Nats: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: EventProtocol: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Nats: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field URL", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -4618,13 +3829,13 @@ func (m *EventProtocol) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Type = github_com_argoproj_argo_events_pkg_common.EventProtocolType(dAtA[iNdEx:postIndex]) + m.URL = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Http", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field StartWithLastReceived", wireType) } - var msglen int + var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -4634,27 +3845,17 @@ func (m *EventProtocol) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= (int(b) & 0x7F) << shift + v |= (int(b) & 0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Http.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex + m.StartWithLastReceived = bool(v != 0) case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Nats", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DeliverAllAvailable", wireType) } - var msglen int + var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -4664,75 +3865,15 @@ func (m *EventProtocol) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= (int(b) & 0x7F) << shift + v |= (int(b) & 0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Nats.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *FileArtifact) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: FileArtifact: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: FileArtifact: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + m.DeliverAllAvailable = bool(v != 0) + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field StartAtSequence", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -4757,61 +3898,11 @@ func (m *FileArtifact) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Path = string(dAtA[iNdEx:postIndex]) + m.StartAtSequence = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GroupVersionKind) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: GroupVersionKind: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GroupVersionKind: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Group", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field StartAtTime", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -4836,11 +3927,11 @@ func (m *GroupVersionKind) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Group = string(dAtA[iNdEx:postIndex]) + m.StartAtTime = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field StartAtTimeDelta", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -4865,13 +3956,13 @@ func (m *GroupVersionKind) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Version = string(dAtA[iNdEx:postIndex]) + m.StartAtTimeDelta = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Durable", wireType) } - var stringLen uint64 + var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -4881,74 +3972,73 @@ func (m *GroupVersionKind) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift + v |= (int(b) & 0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + m.Durable = bool(v != 0) + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClusterId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } postIndex := iNdEx + intStringLen if postIndex > l { return io.ErrUnexpectedEOF } - m.Kind = string(dAtA[iNdEx:postIndex]) + m.ClusterId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClientId", wireType) } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Http) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated } - if iNdEx >= l { + postIndex := iNdEx + intStringLen + if postIndex > l { return io.ErrUnexpectedEOF } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Http: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Http: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + m.ClientId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 10: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Port", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -4973,7 +4063,7 @@ func (m *Http) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Port = string(dAtA[iNdEx:postIndex]) + m.Type = github_com_argoproj_argo_events_pkg_apis_common.NatsType(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -4996,7 +4086,7 @@ func (m *Http) Unmarshal(dAtA []byte) error { } return nil } -func (m *Nats) Unmarshal(dAtA []byte) error { +func (m *NodeStatus) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -5019,15 +4109,15 @@ func (m *Nats) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Nats: wiretype end group for non-group") + return fmt.Errorf("proto: NodeStatus: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Nats: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: NodeStatus: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field URL", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -5052,13 +4142,13 @@ func (m *Nats) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.URL = string(dAtA[iNdEx:postIndex]) + m.ID = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field StartWithLastReceived", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) } - var v int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -5068,35 +4158,24 @@ func (m *Nats) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= (int(b) & 0x7F) << shift + stringLen |= (uint64(b) & 0x7F) << shift if b < 0x80 { break } } - m.StartWithLastReceived = bool(v != 0) - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field DeliverAllAvailable", wireType) + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF } - m.DeliverAllAvailable = bool(v != 0) - case 4: + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StartAtSequence", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field DisplayName", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -5121,11 +4200,11 @@ func (m *Nats) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.StartAtSequence = string(dAtA[iNdEx:postIndex]) + m.DisplayName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 5: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StartAtTime", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -5150,11 +4229,11 @@ func (m *Nats) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.StartAtTime = string(dAtA[iNdEx:postIndex]) + m.Type = NodeType(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 6: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StartAtTimeDelta", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Phase", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -5179,13 +4258,13 @@ func (m *Nats) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.StartAtTimeDelta = string(dAtA[iNdEx:postIndex]) + m.Phase = NodePhase(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 7: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Durable", wireType) + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StartedAt", wireType) } - var v int + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -5195,17 +4274,27 @@ func (m *Nats) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= (int(b) & 0x7F) << shift + msglen |= (int(b) & 0x7F) << shift if b < 0x80 { break } } - m.Durable = bool(v != 0) - case 8: + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.StartedAt.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClusterId", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CompletedAt", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -5215,24 +4304,25 @@ func (m *Nats) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift + msglen |= (int(b) & 0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex > l { return io.ErrUnexpectedEOF } - m.ClusterId = string(dAtA[iNdEx:postIndex]) + if err := m.CompletedAt.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 9: + case 8: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClientId", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -5257,13 +4347,13 @@ func (m *Nats) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ClientId = string(dAtA[iNdEx:postIndex]) + m.Message = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 10: + case 9: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Event", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -5273,20 +4363,24 @@ func (m *Nats) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift + msglen |= (int(b) & 0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex > l { return io.ErrUnexpectedEOF } - m.Type = github_com_argoproj_argo_events_pkg_common.NatsType(dAtA[iNdEx:postIndex]) + if m.Event == nil { + m.Event = &common.Event{} + } + if err := m.Event.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -5309,7 +4403,7 @@ func (m *Nats) Unmarshal(dAtA []byte) error { } return nil } -func (m *NodeStatus) Unmarshal(dAtA []byte) error { +func (m *ResourceObject) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -5332,15 +4426,15 @@ func (m *NodeStatus) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: NodeStatus: wiretype end group for non-group") + return fmt.Errorf("proto: ResourceObject: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: NodeStatus: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ResourceObject: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -5365,13 +4459,13 @@ func (m *NodeStatus) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ID = string(dAtA[iNdEx:postIndex]) + m.Namespace = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Labels", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -5381,902 +4475,115 @@ func (m *NodeStatus) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift + msglen |= (int(b) & 0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex > l { return io.ErrUnexpectedEOF } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DisplayName", wireType) + if m.Labels == nil { + m.Labels = make(map[string]string) } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DisplayName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Type = NodeType(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Phase", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Phase = NodePhase(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StartedAt", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.StartedAt.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CompletedAt", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.CompletedAt.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Message = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Event", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Event == nil { - m.Event = &Event{} - } - if err := m.Event.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ResourceObject) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ResourceObject: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ResourceObject: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Namespace = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Labels", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Labels == nil { - m.Labels = make(map[string]string) - } - var mapkey string - var mapvalue string - for iNdEx < postIndex { - entryPreIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - if fieldNum == 1 { - var stringLenmapkey uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapkey |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapkey := int(stringLenmapkey) - if intStringLenmapkey < 0 { - return ErrInvalidLengthGenerated - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey > l { - return io.ErrUnexpectedEOF - } - mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) - iNdEx = postStringIndexmapkey - } else if fieldNum == 2 { - var stringLenmapvalue uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLenmapvalue |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLenmapvalue := int(stringLenmapvalue) - if intStringLenmapvalue < 0 { - return ErrInvalidLengthGenerated - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Labels[mapkey] = mapvalue - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Parameters", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Parameters = append(m.Parameters, ResourceParameter{}) - if err := m.Parameters[len(m.Parameters)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GroupVersionKind", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.GroupVersionKind.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Source", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Source.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ResourceParameter) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ResourceParameter: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ResourceParameter: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Src", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Src == nil { - m.Src = &ResourceParameterSource{} - } - if err := m.Src.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Dest", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Dest = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ResourceParameterSource) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: ResourceParameterSource: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ResourceParameterSource: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Event", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Event = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Path = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - s := string(dAtA[iNdEx:postIndex]) - m.Value = &s - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RetryStrategy) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: RetryStrategy: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RetryStrategy: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *S3Artifact) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: S3Artifact: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: S3Artifact: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var stringLenmapvalue uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapvalue |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Key = string(dAtA[iNdEx:postIndex]) + m.Labels[mapkey] = mapvalue iNdEx = postIndex - case 2: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Event", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Parameters", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -6286,24 +4593,26 @@ func (m *S3Artifact) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift + msglen |= (int(b) & 0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex > l { return io.ErrUnexpectedEOF } - m.Event = github_com_minio_minio_go.NotificationEventType(dAtA[iNdEx:postIndex]) + m.Parameters = append(m.Parameters, ResourceParameter{}) + if err := m.Parameters[len(m.Parameters)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 3: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Filter", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field GroupVersionKind", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -6327,16 +4636,13 @@ func (m *S3Artifact) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Filter == nil { - m.Filter = &S3Filter{} - } - if err := m.Filter.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.GroupVersionKind.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 4: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field S3Bucket", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Source", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -6360,10 +4666,7 @@ func (m *S3Artifact) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.S3Bucket == nil { - m.S3Bucket = &S3Bucket{} - } - if err := m.S3Bucket.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Source.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -6388,7 +4691,7 @@ func (m *S3Artifact) Unmarshal(dAtA []byte) error { } return nil } -func (m *S3Bucket) Unmarshal(dAtA []byte) error { +func (m *ResourceParameter) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -6411,17 +4714,17 @@ func (m *S3Bucket) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: S3Bucket: wiretype end group for non-group") + return fmt.Errorf("proto: ResourceParameter: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: S3Bucket: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ResourceParameter: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Endpoint", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Src", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -6431,24 +4734,28 @@ func (m *S3Bucket) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift + msglen |= (int(b) & 0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex > l { return io.ErrUnexpectedEOF } - m.Endpoint = string(dAtA[iNdEx:postIndex]) + if m.Src == nil { + m.Src = &ResourceParameterSource{} + } + if err := m.Src.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Bucket", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Dest", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -6473,11 +4780,61 @@ func (m *S3Bucket) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Bucket = string(dAtA[iNdEx:postIndex]) + m.Dest = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResourceParameterSource) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ResourceParameterSource: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResourceParameterSource: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Region", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Event", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -6502,33 +4859,13 @@ func (m *S3Bucket) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Region = string(dAtA[iNdEx:postIndex]) + m.Event = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Insecure", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - m.Insecure = bool(v != 0) - case 5: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AccessKey", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -6538,30 +4875,26 @@ func (m *S3Bucket) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= (int(b) & 0x7F) << shift + stringLen |= (uint64(b) & 0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex > l { return io.ErrUnexpectedEOF } - if m.AccessKey == nil { - m.AccessKey = &v11.SecretKeySelector{} - } - if err := m.AccessKey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Path = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 6: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SecretKey", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -6571,24 +4904,21 @@ func (m *S3Bucket) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= (int(b) & 0x7F) << shift + stringLen |= (uint64(b) & 0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthGenerated } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex > l { return io.ErrUnexpectedEOF } - if m.SecretKey == nil { - m.SecretKey = &v11.SecretKeySelector{} - } - if err := m.SecretKey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + s := string(dAtA[iNdEx:postIndex]) + m.Value = &s iNdEx = postIndex default: iNdEx = preIndex @@ -6611,7 +4941,7 @@ func (m *S3Bucket) Unmarshal(dAtA []byte) error { } return nil } -func (m *S3Filter) Unmarshal(dAtA []byte) error { +func (m *RetryStrategy) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -6634,70 +4964,12 @@ func (m *S3Filter) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: S3Filter: wiretype end group for non-group") + return fmt.Errorf("proto: RetryStrategy: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: S3Filter: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: RetryStrategy: illegal tag %d (wire type %d)", fieldNum, wire) } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Prefix", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Prefix = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Suffix", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Suffix = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex + switch fieldNum { default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -7740,278 +6012,6 @@ func (m *Trigger) Unmarshal(dAtA []byte) error { } return nil } -func (m *URI) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: URI: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: URI: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Scheme", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Scheme = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field User", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.User = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Password", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Password = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Host", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Host = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Port", wireType) - } - m.Port = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Port |= (int32(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Path = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Query", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Query = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Fragment", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + intStringLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Fragment = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGenerated - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *URLArtifact) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -8217,172 +6217,137 @@ var ( ) func init() { - proto.RegisterFile("github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1/generated.proto", fileDescriptor_generated_9dc287890dc55c87) -} - -var fileDescriptor_generated_9dc287890dc55c87 = []byte{ - // 2606 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x59, 0xcd, 0x6f, 0x1b, 0xc7, - 0x15, 0xf7, 0xf2, 0x4b, 0xe4, 0x93, 0x6c, 0xc9, 0xe3, 0x18, 0x21, 0x14, 0x44, 0x34, 0x36, 0x68, - 0xe0, 0x16, 0x31, 0x69, 0x5b, 0x4d, 0xe1, 0x16, 0x4d, 0x1b, 0x51, 0x94, 0x63, 0x59, 0xb2, 0x2c, - 0x0f, 0x63, 0x07, 0x70, 0x03, 0x54, 0xab, 0xdd, 0x21, 0xb5, 0xd6, 0x72, 0x77, 0x3d, 0x33, 0x54, - 0xcd, 0xa2, 0x68, 0x93, 0x7e, 0x5c, 0x7a, 0x28, 0x72, 0xef, 0xb1, 0xff, 0x40, 0x2f, 0x2d, 0x7a, - 0xee, 0xc9, 0x97, 0x02, 0x29, 0x0a, 0x14, 0xe9, 0x45, 0xa8, 0x59, 0xa0, 0x87, 0xa2, 0x7f, 0x81, - 0x4f, 0xc1, 0x7c, 0xec, 0xec, 0x92, 0x94, 0x60, 0x59, 0xd4, 0xc5, 0xe6, 0xbe, 0xf7, 0xe6, 0xf7, - 0xde, 0xbc, 0x79, 0xf3, 0x3e, 0x46, 0x70, 0xa7, 0xeb, 0xf3, 0xbd, 0xfe, 0x6e, 0xdd, 0x8d, 0x7a, - 0x0d, 0x87, 0x76, 0xa3, 0x98, 0x46, 0x4f, 0xe4, 0x8f, 0x6b, 0xe4, 0x80, 0x84, 0x9c, 0x35, 0xe2, - 0xfd, 0x6e, 0xc3, 0x89, 0x7d, 0xd6, 0x60, 0x24, 0x64, 0x11, 0x6d, 0x1c, 0xdc, 0x70, 0x82, 0x78, - 0xcf, 0xb9, 0xd1, 0xe8, 0x92, 0x90, 0x50, 0x87, 0x13, 0xaf, 0x1e, 0xd3, 0x88, 0x47, 0xe8, 0x56, - 0x8a, 0x54, 0x4f, 0x90, 0xe4, 0x8f, 0x1f, 0x2b, 0xa4, 0x7a, 0xbc, 0xdf, 0xad, 0x0b, 0xa4, 0xba, - 0x42, 0xaa, 0x27, 0x48, 0x8b, 0xd7, 0x32, 0x36, 0x74, 0xa3, 0x6e, 0xd4, 0x90, 0x80, 0xbb, 0xfd, - 0x8e, 0xfc, 0x92, 0x1f, 0xf2, 0x97, 0x52, 0xb4, 0x68, 0xef, 0xdf, 0x62, 0x75, 0x3f, 0x12, 0x56, - 0x35, 0xdc, 0x88, 0x92, 0xc6, 0xc1, 0x84, 0x31, 0x8b, 0xdf, 0x4e, 0x65, 0x7a, 0x8e, 0xbb, 0xe7, - 0x87, 0x84, 0x0e, 0xd2, 0xad, 0xf4, 0x08, 0x77, 0x8e, 0x5a, 0xd5, 0x38, 0x6e, 0x15, 0xed, 0x87, - 0xdc, 0xef, 0x91, 0x89, 0x05, 0xdf, 0x79, 0xd5, 0x02, 0xe6, 0xee, 0x91, 0x9e, 0x33, 0xb1, 0x6e, - 0xf9, 0xb8, 0x75, 0x7d, 0xee, 0x07, 0x0d, 0x3f, 0xe4, 0x8c, 0xd3, 0xf1, 0x45, 0xf6, 0x3f, 0xf3, - 0xb0, 0xb0, 0x42, 0xb9, 0xdf, 0x71, 0x5c, 0xbe, 0x19, 0xb9, 0x0e, 0xf7, 0xa3, 0x10, 0x7d, 0x0a, - 0x39, 0xb6, 0x5c, 0xb5, 0xae, 0x58, 0x57, 0x67, 0x6f, 0xb6, 0xea, 0xa7, 0x3d, 0x82, 0x7a, 0x7b, - 0x39, 0x41, 0x6e, 0x96, 0x86, 0x87, 0xb5, 0x5c, 0x7b, 0x19, 0xe7, 0xd8, 0x32, 0xb2, 0xa1, 0xe4, - 0x87, 0x81, 0x1f, 0x92, 0x6a, 0xee, 0x8a, 0x75, 0xb5, 0xd2, 0x84, 0xe1, 0x61, 0xad, 0xb4, 0x2e, - 0x29, 0x58, 0x73, 0x90, 0x07, 0x85, 0x8e, 0x1f, 0x90, 0x6a, 0x5e, 0xda, 0x70, 0xfb, 0xf4, 0x36, - 0xdc, 0xf6, 0x03, 0x62, 0xac, 0x28, 0x0f, 0x0f, 0x6b, 0x05, 0x41, 0xc1, 0x12, 0x1d, 0xed, 0x40, - 0xbe, 0x4f, 0x83, 0x6a, 0x41, 0x2a, 0x59, 0x3b, 0xbd, 0x92, 0x87, 0x78, 0xd3, 0xe8, 0x98, 0x19, - 0x1e, 0xd6, 0xf2, 0x0f, 0xf1, 0x26, 0x16, 0xd0, 0xe8, 0x19, 0x54, 0xdc, 0x28, 0xec, 0xf8, 0xdd, - 0x9e, 0x13, 0x57, 0x8b, 0x52, 0xcf, 0xc6, 0xe9, 0xf5, 0xac, 0x26, 0x50, 0x46, 0xdb, 0xf9, 0xe1, - 0x61, 0xad, 0x62, 0xc8, 0x38, 0x55, 0x66, 0xff, 0xc6, 0x82, 0x8b, 0x13, 0xf2, 0xe8, 0x0a, 0x14, - 0x42, 0xa7, 0x47, 0xe4, 0xd9, 0x56, 0x9a, 0x73, 0xcf, 0x0f, 0x6b, 0xe7, 0x84, 0x4f, 0xb6, 0x9c, - 0x1e, 0xc1, 0x92, 0x83, 0x1a, 0x50, 0x11, 0xff, 0xb3, 0xd8, 0x71, 0x93, 0x03, 0xba, 0xa8, 0xc5, - 0x2a, 0x5b, 0x09, 0x03, 0xa7, 0x32, 0xe8, 0x6d, 0xc8, 0xef, 0x93, 0x81, 0x3c, 0xa9, 0x4a, 0x73, - 0x56, 0x8b, 0xe6, 0x37, 0xc8, 0x00, 0x0b, 0xba, 0xcd, 0xa0, 0xd0, 0x72, 0xb8, 0x83, 0xf6, 0x61, - 0xa6, 0xe3, 0x07, 0x9c, 0x50, 0x56, 0xb5, 0xae, 0xe4, 0xa7, 0x0b, 0x2c, 0x01, 0x78, 0x5b, 0x82, - 0x35, 0x67, 0x87, 0x87, 0xb5, 0x19, 0xf5, 0x9b, 0xe1, 0x44, 0x83, 0xfd, 0xb9, 0x05, 0x90, 0x0a, - 0x89, 0x5d, 0xc7, 0x0e, 0xdf, 0x1b, 0xdf, 0xf5, 0xb6, 0xc3, 0xf7, 0xb0, 0xe4, 0xa0, 0xf7, 0xa0, - 0xc0, 0x07, 0x71, 0xb2, 0xe1, 0x6a, 0x22, 0xf1, 0xf1, 0x20, 0x26, 0x2f, 0x0f, 0x6b, 0xe5, 0xbb, - 0xed, 0xfb, 0x5b, 0xe2, 0x37, 0x96, 0x52, 0xe8, 0x1d, 0x28, 0x1e, 0x38, 0x41, 0x9f, 0xe8, 0x4d, - 0x9f, 0xd7, 0xe2, 0xc5, 0x47, 0x82, 0x88, 0x15, 0xcf, 0xfe, 0xbd, 0x05, 0xc5, 0x35, 0xb1, 0x11, - 0xf4, 0x14, 0x66, 0xdc, 0x28, 0xe4, 0xe4, 0x19, 0xd7, 0x77, 0x6a, 0x8a, 0x78, 0x96, 0x88, 0xab, - 0x0a, 0xad, 0x39, 0xaf, 0x15, 0xcf, 0x68, 0x02, 0x4e, 0xf4, 0xa0, 0x1a, 0x14, 0x3c, 0x87, 0x3b, - 0x72, 0x3f, 0x73, 0xca, 0x49, 0xdb, 0xce, 0x20, 0x88, 0x1c, 0x0f, 0x4b, 0x86, 0xfd, 0xc7, 0x12, - 0xcc, 0x65, 0xb1, 0xc4, 0xb9, 0x4b, 0xdd, 0x62, 0x9b, 0xda, 0x51, 0xe6, 0xdc, 0xd7, 0x12, 0x06, - 0x4e, 0x65, 0x50, 0x0b, 0x16, 0xcc, 0xc7, 0x23, 0x42, 0x99, 0x1f, 0x85, 0x63, 0xee, 0x5b, 0x58, - 0x1b, 0xe3, 0xe3, 0x89, 0x15, 0xe8, 0x2e, 0x20, 0x37, 0x88, 0xfa, 0x9e, 0x14, 0x65, 0x09, 0x8e, - 0xf2, 0xeb, 0xa2, 0xc6, 0x41, 0xab, 0x13, 0x12, 0xf8, 0x88, 0x55, 0xc8, 0x81, 0x12, 0x8b, 0xfa, - 0xd4, 0x25, 0xfa, 0x46, 0x7f, 0x30, 0xcd, 0x8d, 0x5e, 0x57, 0x79, 0xa9, 0x2d, 0x01, 0xb1, 0x06, - 0x46, 0xdf, 0x84, 0x19, 0xb9, 0x74, 0xbd, 0x25, 0x6f, 0x73, 0x25, 0x3d, 0x82, 0x35, 0x45, 0xc6, - 0x09, 0x1f, 0xed, 0x24, 0x0e, 0xf5, 0x7b, 0xa4, 0x5a, 0x92, 0x06, 0x35, 0xea, 0x2a, 0x45, 0xd7, - 0xb3, 0x29, 0x3a, 0x35, 0x42, 0x54, 0x90, 0xfa, 0xc1, 0x8d, 0xfa, 0x3d, 0xdf, 0xa5, 0x91, 0x58, - 0x36, 0x7e, 0x02, 0x7e, 0xcf, 0x9c, 0x80, 0xdf, 0x23, 0xe8, 0x09, 0x54, 0x54, 0x29, 0x78, 0x88, - 0x37, 0xab, 0x33, 0x67, 0xb1, 0x65, 0x99, 0x4e, 0xda, 0x09, 0x26, 0x4e, 0xe1, 0xd1, 0xfb, 0x30, - 0x2b, 0x63, 0x4b, 0x07, 0x48, 0x59, 0x6e, 0xfe, 0x92, 0x36, 0x6f, 0x76, 0x35, 0x65, 0xe1, 0xac, - 0x1c, 0xfa, 0xad, 0x05, 0x40, 0x9e, 0x71, 0x12, 0x8a, 0x03, 0x62, 0xd5, 0x8a, 0xbc, 0xf9, 0x8f, - 0xce, 0x26, 0xfc, 0xeb, 0x6b, 0x06, 0x78, 0x2d, 0xe4, 0x74, 0xd0, 0x44, 0xda, 0x1c, 0x48, 0x19, - 0x38, 0xa3, 0x7d, 0xf1, 0x03, 0x98, 0x1f, 0x5b, 0x82, 0x16, 0x54, 0xf2, 0x92, 0xf1, 0x2e, 0xf3, - 0x15, 0x7a, 0x23, 0xb9, 0xdb, 0x32, 0x96, 0xf5, 0x65, 0xfe, 0x5e, 0xee, 0x96, 0x65, 0xff, 0x2e, - 0x07, 0xf3, 0x52, 0x7f, 0x8b, 0xc4, 0x24, 0xf4, 0x48, 0xe8, 0x0e, 0x4e, 0x90, 0x4f, 0xdf, 0x83, - 0xb2, 0x47, 0x1c, 0xcf, 0xd4, 0xbb, 0x7c, 0x73, 0x41, 0x4b, 0x95, 0x5b, 0x9a, 0x8e, 0x8d, 0x04, - 0xfa, 0x69, 0x9a, 0x25, 0x55, 0xe9, 0xbb, 0x3f, 0xa5, 0xaf, 0x52, 0x5b, 0x75, 0xc2, 0x34, 0x01, - 0x3b, 0x9e, 0x34, 0x45, 0x06, 0x70, 0xa3, 0x30, 0x24, 0x2e, 0x27, 0x9e, 0xbc, 0x41, 0xe5, 0x34, - 0xfe, 0x56, 0x13, 0x06, 0x4e, 0x65, 0xec, 0xff, 0xe5, 0xe0, 0xf2, 0x91, 0x4a, 0x4e, 0xe0, 0x96, - 0x5d, 0x28, 0x88, 0x5e, 0x46, 0xba, 0x64, 0xaa, 0x5a, 0x20, 0x6e, 0x82, 0xde, 0x9a, 0x2c, 0xef, - 0xf2, 0x92, 0x48, 0x6c, 0xd4, 0x4b, 0xf3, 0x6e, 0xfe, 0x4c, 0xf3, 0xee, 0xec, 0x91, 0x39, 0xf7, - 0x53, 0x9d, 0x73, 0x55, 0xf2, 0xf9, 0xc1, 0x74, 0xe5, 0x4d, 0x6d, 0x46, 0xfc, 0xd2, 0x09, 0xfb, - 0x4f, 0x39, 0x38, 0x2f, 0x8d, 0xd8, 0x16, 0x7d, 0x9b, 0x1b, 0x05, 0x68, 0x47, 0xd7, 0x2c, 0xe5, - 0xe4, 0xcd, 0xb1, 0x9a, 0xf5, 0xfd, 0x93, 0xf4, 0xe0, 0x6e, 0xd4, 0xeb, 0x45, 0x61, 0x7d, 0x04, - 0x37, 0x53, 0xe7, 0x76, 0xa0, 0xb0, 0xc7, 0x79, 0xac, 0x0f, 0x69, 0x8a, 0x1d, 0xdd, 0xe1, 0x3c, - 0x4e, 0xc3, 0x40, 0x7c, 0x61, 0x89, 0x2c, 0x34, 0x84, 0x0e, 0x4f, 0x82, 0x7d, 0x0a, 0x0d, 0x5b, - 0x0e, 0x67, 0xd9, 0x40, 0xe3, 0x0c, 0x4b, 0x64, 0xfb, 0x3a, 0xcc, 0x65, 0x7b, 0xc0, 0x57, 0xf7, - 0x02, 0xf6, 0xaf, 0x2d, 0x58, 0xf8, 0x88, 0x46, 0xfd, 0x58, 0xd7, 0x95, 0x0d, 0x3f, 0xf4, 0x44, - 0xc9, 0xef, 0x0a, 0x9a, 0x5e, 0x67, 0x4a, 0xbe, 0x14, 0xc4, 0x8a, 0x27, 0xaa, 0xc3, 0xc1, 0x48, - 0x25, 0x34, 0x97, 0x2d, 0x29, 0x5b, 0x09, 0x5f, 0x98, 0xb1, 0xef, 0x87, 0x9e, 0xae, 0x74, 0xc6, - 0x0c, 0xa1, 0x0b, 0x4b, 0x8e, 0x7d, 0x15, 0xa4, 0xa3, 0xa4, 0xc1, 0x11, 0xe5, 0x13, 0x06, 0x47, - 0x94, 0x63, 0xc9, 0xb1, 0xff, 0x5f, 0x00, 0xb9, 0x63, 0xd1, 0x8a, 0x89, 0x7e, 0xd6, 0x1a, 0x6d, - 0xc5, 0x4c, 0x33, 0xda, 0x86, 0xcb, 0x8c, 0x3b, 0x94, 0x7f, 0xe2, 0xf3, 0xbd, 0x4d, 0x87, 0x71, - 0x4c, 0x5c, 0xe2, 0x1f, 0x10, 0x4f, 0x1a, 0x5b, 0x6e, 0xbe, 0xad, 0x17, 0x5c, 0x6e, 0x1f, 0x25, - 0x84, 0x8f, 0x5e, 0x8b, 0xee, 0xc1, 0x25, 0x8f, 0x04, 0xfe, 0x01, 0xa1, 0x2b, 0x41, 0xb0, 0x72, - 0xe0, 0xf8, 0x81, 0xb3, 0xab, 0x1b, 0xf7, 0x72, 0xf3, 0x2d, 0x0d, 0x79, 0xa9, 0x35, 0x29, 0x82, - 0x8f, 0x5a, 0x87, 0x56, 0x60, 0x5e, 0xea, 0x59, 0xe1, 0x6d, 0xf2, 0xb4, 0x4f, 0x42, 0x5d, 0xcc, - 0x2b, 0xcd, 0x37, 0x35, 0xd4, 0x7c, 0x7b, 0x94, 0x8d, 0xc7, 0xe5, 0x45, 0xa9, 0xd2, 0x24, 0x59, - 0x7a, 0x8b, 0xa3, 0xa5, 0xaa, 0x9d, 0xb2, 0x70, 0x56, 0x4e, 0xf4, 0x33, 0x99, 0xcf, 0x16, 0x09, - 0xb8, 0x23, 0xcb, 0x76, 0xa6, 0x9f, 0x69, 0x8f, 0xf1, 0xf1, 0xc4, 0x0a, 0x11, 0x02, 0x5e, 0x9f, - 0x4a, 0x17, 0xcc, 0x48, 0x17, 0x98, 0x10, 0x68, 0x29, 0x32, 0x4e, 0xf8, 0x32, 0xdf, 0x06, 0x7d, - 0xc6, 0x09, 0x5d, 0xf7, 0x74, 0x41, 0x4d, 0xf3, 0x6d, 0xc2, 0xc0, 0xa9, 0x8c, 0x28, 0x25, 0x6e, - 0xe0, 0x8b, 0xee, 0xc2, 0xab, 0x56, 0xa4, 0xbc, 0x29, 0x25, 0xab, 0x9a, 0x8e, 0x8d, 0x04, 0xfa, - 0x44, 0xa7, 0x07, 0x90, 0x92, 0xab, 0x63, 0xe9, 0x61, 0xf9, 0x35, 0xd2, 0x83, 0x88, 0xad, 0x34, - 0x2b, 0xd8, 0x7f, 0x29, 0x00, 0x6c, 0x45, 0x1e, 0x69, 0x73, 0x87, 0xf7, 0x19, 0x5a, 0x84, 0x9c, - 0xef, 0xe9, 0x98, 0x03, 0xad, 0x25, 0xb7, 0xde, 0xc2, 0x39, 0xdf, 0x33, 0x75, 0x20, 0x77, 0x6c, - 0x1d, 0x78, 0x1f, 0x66, 0x3d, 0x9f, 0xc5, 0x81, 0x33, 0x10, 0x44, 0x7d, 0x1d, 0xcc, 0x61, 0xb5, - 0x52, 0x16, 0xce, 0xca, 0x99, 0x7e, 0xbd, 0x70, 0x74, 0xbf, 0x2e, 0xcc, 0xcb, 0xe4, 0xb1, 0xeb, - 0x50, 0x8c, 0xf7, 0x1c, 0x96, 0xc4, 0x42, 0xd2, 0x57, 0x16, 0xb7, 0x05, 0xf1, 0xa5, 0x18, 0x6c, - 0x22, 0x8f, 0xc8, 0x0f, 0xac, 0x04, 0x45, 0xf3, 0x26, 0x8f, 0x96, 0x78, 0x2b, 0x7c, 0xea, 0xe6, - 0xad, 0x9d, 0x20, 0xe1, 0x14, 0x14, 0x75, 0x44, 0x43, 0xd5, 0x8b, 0x03, 0xa2, 0x74, 0xcc, 0x9c, - 0x4e, 0x47, 0xa6, 0x03, 0x33, 0x58, 0x38, 0x0b, 0x2c, 0x02, 0xb2, 0x47, 0x18, 0x73, 0xba, 0x49, - 0xd3, 0x66, 0x02, 0xf2, 0x9e, 0x22, 0xe3, 0x84, 0x8f, 0x76, 0xa0, 0x28, 0x0f, 0x5f, 0x06, 0xd7, - 0xec, 0xcd, 0x1f, 0x4e, 0x59, 0x2d, 0x9b, 0x15, 0xe1, 0x63, 0xf9, 0x13, 0x2b, 0x60, 0xfb, 0x97, - 0x45, 0xb8, 0x80, 0x89, 0xea, 0xa5, 0xef, 0xef, 0x3e, 0x21, 0x2e, 0x1f, 0x9d, 0x37, 0xad, 0x13, - 0xcc, 0x9b, 0x3f, 0x83, 0x52, 0xe0, 0xec, 0x92, 0x40, 0x14, 0x0d, 0xd1, 0x4d, 0x7e, 0x7c, 0x7a, - 0x33, 0x47, 0x4d, 0xa9, 0x6f, 0x4a, 0x58, 0xd5, 0x4b, 0x5e, 0xd0, 0x36, 0x94, 0x14, 0x11, 0x6b, - 0x9d, 0xe8, 0x17, 0x00, 0xb1, 0x43, 0x9d, 0x1e, 0x91, 0x3d, 0x5a, 0x41, 0x5a, 0xb0, 0x31, 0xbd, - 0x05, 0xdb, 0x09, 0x66, 0xda, 0xc4, 0x1a, 0x12, 0xc3, 0x19, 0x95, 0xe8, 0x0b, 0x0b, 0x16, 0xba, - 0x63, 0xd5, 0x49, 0xbf, 0x2c, 0xdc, 0x3d, 0xbd, 0x1d, 0xe3, 0xf5, 0x2e, 0xcd, 0x79, 0xe3, 0x1c, - 0x3c, 0xa1, 0x1d, 0x51, 0x33, 0x77, 0x95, 0xa6, 0xb5, 0x63, 0xfc, 0x29, 0x2a, 0x3d, 0x87, 0xd1, - 0x41, 0x6c, 0xf1, 0xbb, 0x30, 0x9b, 0x39, 0xae, 0xd7, 0xea, 0xe3, 0xff, 0x60, 0xc1, 0xc5, 0x09, - 0xbf, 0xa3, 0x00, 0xf2, 0x8c, 0xba, 0x7a, 0x40, 0x7f, 0x70, 0x86, 0x27, 0xaa, 0x0c, 0x57, 0xef, - 0x42, 0x6d, 0xea, 0x62, 0xa1, 0x46, 0x24, 0x46, 0x8f, 0x30, 0x3e, 0x9e, 0x18, 0x5b, 0x84, 0x71, - 0x2c, 0x39, 0xf6, 0xe7, 0x16, 0xbc, 0x79, 0x0c, 0x96, 0x68, 0x46, 0xd4, 0x45, 0x1d, 0x6b, 0x46, - 0xb2, 0x77, 0xcd, 0x34, 0x3a, 0xb9, 0x63, 0x1f, 0x3d, 0x6a, 0xa3, 0xcf, 0x18, 0x95, 0x89, 0x27, - 0x8c, 0x79, 0x38, 0x8f, 0x09, 0xa7, 0x83, 0x36, 0xa7, 0x0e, 0x27, 0xdd, 0x81, 0xfd, 0xaf, 0x1c, - 0x40, 0xfa, 0xaa, 0x97, 0x3c, 0xfd, 0x58, 0x47, 0x3f, 0xfd, 0xa0, 0x47, 0x89, 0x99, 0xca, 0x84, - 0x0f, 0x47, 0xcc, 0x7c, 0x79, 0x58, 0x6b, 0x64, 0x6a, 0x50, 0xcf, 0x0f, 0xfd, 0x48, 0xfd, 0x7b, - 0xad, 0x1b, 0xd5, 0xb7, 0x22, 0xee, 0x77, 0x7c, 0x15, 0x03, 0xe9, 0xeb, 0x83, 0xde, 0x59, 0x07, - 0x4a, 0x6a, 0x66, 0xd1, 0x6d, 0x63, 0x73, 0x9a, 0x27, 0x4a, 0x3d, 0x3b, 0xc8, 0x61, 0x5f, 0xfd, - 0xc6, 0x1a, 0x1d, 0x05, 0x50, 0x66, 0xcb, 0xcd, 0xbe, 0xbb, 0x4f, 0xb8, 0x6e, 0xea, 0xa7, 0xd2, - 0xa4, 0x90, 0x9a, 0x73, 0xa2, 0x5e, 0x27, 0x5f, 0xd8, 0x68, 0xb0, 0x0f, 0x73, 0x60, 0xc8, 0xa2, - 0xd4, 0x93, 0xd0, 0x8b, 0x23, 0xdf, 0x1c, 0xb2, 0x29, 0xf5, 0x6b, 0x9a, 0x8e, 0x8d, 0x04, 0x7a, - 0x17, 0x4a, 0xbb, 0xca, 0x4c, 0xe5, 0x69, 0x73, 0x69, 0xb4, 0x12, 0xcd, 0x15, 0x72, 0x94, 0x74, - 0xd3, 0x07, 0x16, 0x23, 0x87, 0x25, 0x15, 0x6b, 0xae, 0xd0, 0xee, 0x87, 0x8c, 0xb8, 0x7d, 0x4a, - 0xf4, 0x20, 0x68, 0xb4, 0xaf, 0x6b, 0x3a, 0x36, 0x12, 0x08, 0x43, 0xc5, 0x71, 0x5d, 0xc2, 0xd8, - 0x06, 0x19, 0xe8, 0x4c, 0xf4, 0x8d, 0x4c, 0x1d, 0xab, 0xbb, 0x11, 0x25, 0xa2, 0x6a, 0xb5, 0x89, - 0x4b, 0x09, 0xdf, 0x20, 0x83, 0x36, 0x09, 0x88, 0xcb, 0x23, 0xaa, 0x9e, 0x1b, 0x56, 0x92, 0xb5, - 0x38, 0x85, 0x11, 0x98, 0x2c, 0x11, 0xd7, 0x59, 0xe5, 0x75, 0x30, 0x0d, 0x19, 0xa7, 0x30, 0xf6, - 0x63, 0xe1, 0x5f, 0x3d, 0xa0, 0xbe, 0x0b, 0xa5, 0x98, 0x92, 0x8e, 0xff, 0x4c, 0x7b, 0xd7, 0x78, - 0x62, 0x5b, 0x52, 0xb1, 0xe6, 0x0a, 0x39, 0xd6, 0xef, 0x08, 0xb9, 0x31, 0xcf, 0xb6, 0x25, 0x15, - 0x6b, 0xae, 0xfd, 0xd7, 0x1c, 0x94, 0xda, 0xf2, 0xc4, 0xd1, 0x0e, 0x94, 0x45, 0x9d, 0x96, 0xa3, - 0xa0, 0xca, 0x26, 0xd7, 0x4f, 0x56, 0xd5, 0x55, 0x15, 0xba, 0x47, 0xb8, 0x93, 0x16, 0x81, 0x94, - 0x86, 0x0d, 0x2a, 0xea, 0x40, 0x81, 0xc5, 0xc4, 0x9d, 0x7e, 0x76, 0x56, 0x16, 0xb7, 0x63, 0xe2, - 0xa6, 0xf9, 0x41, 0x7c, 0x61, 0x89, 0x8f, 0x42, 0x28, 0x31, 0xd9, 0xe3, 0x4d, 0x3f, 0x3e, 0x6b, - 0x4d, 0x12, 0x2d, 0xe3, 0x44, 0xf9, 0x8d, 0xb5, 0x16, 0xfb, 0xef, 0x16, 0x80, 0x12, 0xdc, 0xf4, - 0x99, 0x98, 0xa7, 0xc7, 0x1d, 0x59, 0x3f, 0x99, 0x23, 0xc5, 0x6a, 0xe9, 0x46, 0x13, 0xb5, 0x09, - 0x25, 0xe3, 0x44, 0x02, 0x45, 0x9f, 0x93, 0x1e, 0xab, 0xe6, 0x64, 0x0d, 0xff, 0x70, 0xda, 0xbd, - 0xa5, 0x59, 0x78, 0x5d, 0xc0, 0x62, 0x85, 0x6e, 0xff, 0x23, 0x9f, 0xec, 0x49, 0x38, 0x16, 0xfd, - 0xca, 0x82, 0x39, 0x2f, 0x79, 0x2d, 0xf1, 0x49, 0xf2, 0x16, 0xbe, 0x7e, 0x66, 0xaf, 0x3c, 0xcd, - 0x37, 0xb4, 0x19, 0x73, 0xad, 0x8c, 0x1a, 0x3c, 0xa2, 0x14, 0x45, 0x50, 0xe6, 0xd4, 0xef, 0x76, - 0x45, 0x0b, 0xa3, 0xb6, 0xbf, 0x32, 0xc5, 0x03, 0x8c, 0x42, 0x4a, 0x9d, 0xad, 0x09, 0x0c, 0x1b, - 0x25, 0x68, 0x03, 0xc0, 0x23, 0x71, 0x10, 0x0d, 0x84, 0x13, 0x74, 0x34, 0xbd, 0x75, 0xd4, 0x7d, - 0xde, 0x8e, 0x3c, 0x19, 0x8e, 0x17, 0x44, 0xf0, 0xb7, 0xcc, 0x12, 0x9c, 0x59, 0x8e, 0x3e, 0xb3, - 0xe0, 0x3c, 0xc9, 0xbe, 0x58, 0xe8, 0xe4, 0xfc, 0xd1, 0x94, 0x4e, 0x4c, 0xe0, 0x9a, 0x17, 0x87, - 0x87, 0xb5, 0xd1, 0xb7, 0x16, 0x3c, 0xaa, 0xd0, 0xfe, 0x6f, 0x01, 0xe6, 0xb2, 0x21, 0x9d, 0x4e, - 0x18, 0xd6, 0x49, 0x27, 0x8c, 0x1f, 0x65, 0x27, 0x0c, 0x75, 0x93, 0xbf, 0x75, 0xb2, 0xf0, 0x3e, - 0xc1, 0x70, 0xe1, 0x8c, 0x0e, 0x17, 0xf9, 0xd7, 0x86, 0x7f, 0xad, 0xb9, 0xa2, 0xf0, 0x8a, 0xb9, - 0xe2, 0x00, 0x8a, 0x61, 0xe4, 0x11, 0x56, 0x2d, 0xca, 0x58, 0x7b, 0x70, 0x36, 0x69, 0xa4, 0x2e, - 0x5c, 0xaa, 0xbb, 0x75, 0x73, 0xf7, 0x24, 0x0d, 0x2b, 0x75, 0x68, 0x05, 0xe6, 0xb5, 0xc5, 0x7e, - 0x14, 0xae, 0x46, 0xfd, 0x50, 0x8d, 0x72, 0xc5, 0xf4, 0x2d, 0x61, 0x75, 0x94, 0x8d, 0xc7, 0xe5, - 0x17, 0x7f, 0xae, 0x46, 0xdd, 0x63, 0xbb, 0xcc, 0xc7, 0xd9, 0x2e, 0x73, 0xaa, 0x5c, 0x9c, 0x4e, - 0xd4, 0xd9, 0x5e, 0xb5, 0x0d, 0x90, 0x3e, 0x70, 0x8a, 0xbe, 0x4f, 0x9e, 0xf1, 0x78, 0xdf, 0x27, - 0x63, 0x00, 0x2b, 0x9e, 0xe8, 0xfb, 0x18, 0x8f, 0xe2, 0xf1, 0xbe, 0xaf, 0xcd, 0xa3, 0x18, 0x4b, - 0x8e, 0xfd, 0xb7, 0x1c, 0xcc, 0xe8, 0x4b, 0x7a, 0x82, 0x97, 0x5a, 0x0a, 0x65, 0xaa, 0xfb, 0x50, - 0xbd, 0xcb, 0x3b, 0x67, 0x35, 0x71, 0xa9, 0x5e, 0x28, 0xa1, 0x61, 0xa3, 0x27, 0x1b, 0x5c, 0xf9, - 0x57, 0x04, 0x97, 0xc8, 0x06, 0x94, 0xc4, 0x81, 0x69, 0x52, 0xa7, 0xcf, 0x06, 0x23, 0x3d, 0xaf, - 0xca, 0x06, 0x23, 0x24, 0x3c, 0xaa, 0xd0, 0xfe, 0x73, 0x0e, 0xf2, 0x0f, 0xf1, 0xba, 0x6c, 0x16, - 0xdc, 0x3d, 0x62, 0xbc, 0x99, 0xd6, 0x39, 0x49, 0xc5, 0x9a, 0x2b, 0x7c, 0xde, 0x67, 0x84, 0x8e, - 0x9f, 0xd0, 0x43, 0x46, 0x28, 0x96, 0x1c, 0xd1, 0x80, 0xc5, 0x0e, 0x63, 0x3f, 0x89, 0x68, 0xf2, - 0x42, 0x68, 0xb2, 0xeb, 0xb6, 0xa6, 0x63, 0x23, 0x21, 0xf0, 0xf6, 0x22, 0xc6, 0xf5, 0x3d, 0x4c, - 0x9f, 0x59, 0x23, 0x31, 0x4c, 0x08, 0x8e, 0x79, 0x43, 0x2c, 0xca, 0xf0, 0x3f, 0xe2, 0x0d, 0xd1, - 0x4c, 0x0b, 0xa5, 0x63, 0xa7, 0x85, 0x77, 0xa0, 0xf8, 0xb4, 0x4f, 0xe8, 0x40, 0x3e, 0x55, 0x64, - 0x82, 0xef, 0x81, 0x20, 0x62, 0xc5, 0x13, 0x86, 0x77, 0xa8, 0xd3, 0xed, 0x89, 0xae, 0xbf, 0x3c, - 0x6a, 0xf8, 0x6d, 0x4d, 0xc7, 0x46, 0xc2, 0x76, 0x61, 0x36, 0xf3, 0xa7, 0xf3, 0x13, 0xfc, 0x99, - 0xf6, 0x26, 0xc0, 0x01, 0xa1, 0x7e, 0x67, 0xb0, 0x4a, 0x28, 0xd7, 0xcf, 0x96, 0xa6, 0x57, 0x7a, - 0x64, 0x38, 0x38, 0x23, 0xd5, 0xac, 0x3f, 0x7f, 0xb1, 0x74, 0xee, 0xcb, 0x17, 0x4b, 0xe7, 0xbe, - 0x7a, 0xb1, 0x74, 0xee, 0xb3, 0xe1, 0x92, 0xf5, 0x7c, 0xb8, 0x64, 0x7d, 0x39, 0x5c, 0xb2, 0xbe, - 0x1a, 0x2e, 0x59, 0xff, 0x1e, 0x2e, 0x59, 0x5f, 0xfc, 0x67, 0xe9, 0xdc, 0xe3, 0x72, 0x72, 0xfa, - 0x5f, 0x07, 0x00, 0x00, 0xff, 0xff, 0x82, 0x82, 0x46, 0x88, 0xbd, 0x22, 0x00, 0x00, + proto.RegisterFile("github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1/generated.proto", fileDescriptor_generated_0e5510c518a7be9d) +} + +var fileDescriptor_generated_0e5510c518a7be9d = []byte{ + // 2046 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x58, 0xcd, 0x6f, 0x1b, 0xc7, + 0x15, 0xd7, 0xf2, 0x43, 0x22, 0x1f, 0x25, 0x4b, 0x1e, 0xc7, 0x08, 0xa1, 0x20, 0xa2, 0xb1, 0xbd, + 0xb8, 0x45, 0xb2, 0xb4, 0xa5, 0x26, 0x70, 0x5b, 0xf4, 0x43, 0x14, 0xed, 0x58, 0x91, 0x2c, 0xcb, + 0xb3, 0x8e, 0x03, 0xa4, 0x05, 0xea, 0xd1, 0xee, 0x88, 0xda, 0x68, 0xb9, 0xbb, 0xdd, 0x19, 0x12, + 0x61, 0x51, 0xb4, 0xe9, 0xd7, 0xb5, 0xc8, 0xff, 0xd0, 0x3f, 0xa0, 0xf7, 0x1e, 0x7b, 0xf2, 0x25, + 0x40, 0x8a, 0x5e, 0x72, 0x12, 0x6a, 0x16, 0xe8, 0xbd, 0x57, 0x9f, 0x8a, 0xf9, 0xd8, 0x0f, 0x2e, + 0x25, 0x98, 0x12, 0x7d, 0x22, 0xe7, 0xbd, 0x37, 0xbf, 0xf7, 0xe6, 0xcd, 0x9b, 0xf7, 0xb1, 0xf0, + 0xb0, 0xe7, 0xf1, 0x93, 0xc1, 0x91, 0xe5, 0x84, 0xfd, 0x36, 0x89, 0x7b, 0x61, 0x14, 0x87, 0x9f, + 0xcb, 0x3f, 0xef, 0xd3, 0x21, 0x0d, 0x38, 0x6b, 0x47, 0xa7, 0xbd, 0x36, 0x89, 0x3c, 0xd6, 0x66, + 0x34, 0x60, 0x61, 0xdc, 0x1e, 0xde, 0x25, 0x7e, 0x74, 0x42, 0xee, 0xb6, 0x7b, 0x34, 0xa0, 0x31, + 0xe1, 0xd4, 0xb5, 0xa2, 0x38, 0xe4, 0x21, 0xba, 0x97, 0x21, 0x59, 0x09, 0x92, 0xfc, 0xf3, 0x4b, + 0x85, 0x64, 0x45, 0xa7, 0x3d, 0x4b, 0x20, 0x59, 0x0a, 0xc9, 0x4a, 0x90, 0xd6, 0x7f, 0x3a, 0xb3, + 0x0d, 0x4e, 0xd8, 0xef, 0x87, 0x41, 0x51, 0xf5, 0xfa, 0xfb, 0x39, 0x80, 0x5e, 0xd8, 0x0b, 0xdb, + 0x92, 0x7c, 0x34, 0x38, 0x96, 0x2b, 0xb9, 0x90, 0xff, 0xb4, 0xb8, 0x79, 0x7a, 0x8f, 0x59, 0x5e, + 0x28, 0x20, 0xdb, 0x4e, 0x18, 0xd3, 0xf6, 0x70, 0xea, 0x34, 0xeb, 0xdf, 0xcf, 0x64, 0xfa, 0xc4, + 0x39, 0xf1, 0x02, 0x1a, 0x8f, 0x32, 0x3b, 0xfa, 0x94, 0x93, 0xf3, 0x76, 0xb5, 0x2f, 0xda, 0x15, + 0x0f, 0x02, 0xee, 0xf5, 0xe9, 0xd4, 0x86, 0x0f, 0x5f, 0xb7, 0x81, 0x39, 0x27, 0xb4, 0x4f, 0xa6, + 0xf6, 0x6d, 0x5d, 0xb4, 0x6f, 0xc0, 0x3d, 0xbf, 0xed, 0x05, 0x9c, 0xf1, 0xb8, 0xb8, 0xc9, 0xfc, + 0xba, 0x0c, 0x6b, 0xdb, 0x31, 0xf7, 0x8e, 0x89, 0xc3, 0xf7, 0x43, 0x87, 0x70, 0x2f, 0x0c, 0x90, + 0x0d, 0x25, 0xb6, 0xd5, 0x34, 0x6e, 0x19, 0xb7, 0x1b, 0x9b, 0x3f, 0xb2, 0x66, 0xbe, 0x43, 0x75, + 0x13, 0x96, 0xbd, 0x95, 0x00, 0x76, 0x16, 0xc7, 0x67, 0xad, 0x92, 0xbd, 0x85, 0x4b, 0x6c, 0x0b, + 0x99, 0xb0, 0xe8, 0x05, 0xbe, 0x17, 0xd0, 0x66, 0xe9, 0x96, 0x71, 0xbb, 0xde, 0x81, 0xf1, 0x59, + 0x6b, 0x71, 0x57, 0x52, 0xb0, 0xe6, 0x20, 0x17, 0x2a, 0xc7, 0x9e, 0x4f, 0x9b, 0x65, 0xa9, 0xfa, + 0x81, 0x75, 0xd5, 0xf0, 0xb1, 0x1e, 0x78, 0x3e, 0x4d, 0xad, 0xa8, 0x8d, 0xcf, 0x5a, 0x15, 0x41, + 0xc1, 0x12, 0x1d, 0x3d, 0x87, 0xf2, 0x20, 0xf6, 0x9b, 0x15, 0xa9, 0xe4, 0xfe, 0xd5, 0x95, 0x7c, + 0x82, 0xf7, 0x53, 0x1d, 0x4b, 0xe3, 0xb3, 0x56, 0xf9, 0x13, 0xbc, 0x8f, 0x05, 0x34, 0xfa, 0x02, + 0xea, 0x4e, 0x18, 0x1c, 0x7b, 0xbd, 0x3e, 0x89, 0x9a, 0x55, 0xa9, 0x67, 0xef, 0xea, 0x7a, 0x76, + 0x12, 0xa8, 0x54, 0xdb, 0xca, 0xf8, 0xac, 0x55, 0x4f, 0xc9, 0x38, 0x53, 0x66, 0xfe, 0xd9, 0x80, + 0xeb, 0x53, 0xf2, 0xe8, 0x16, 0x54, 0x02, 0xd2, 0xa7, 0xf2, 0x4a, 0xeb, 0x9d, 0xe5, 0x17, 0x67, + 0xad, 0x05, 0xe1, 0x93, 0x03, 0xd2, 0xa7, 0x58, 0x72, 0x50, 0x1b, 0xea, 0xe2, 0x97, 0x45, 0xc4, + 0x49, 0x2e, 0xe8, 0xba, 0x16, 0xab, 0x1f, 0x24, 0x0c, 0x9c, 0xc9, 0xa0, 0x77, 0xa1, 0x7c, 0x4a, + 0x47, 0xf2, 0xa6, 0xea, 0x9d, 0x86, 0x16, 0x2d, 0xef, 0xd1, 0x11, 0x16, 0x74, 0x93, 0x41, 0xa5, + 0x4b, 0x38, 0x41, 0xa7, 0xb0, 0x74, 0xec, 0xf9, 0x9c, 0xc6, 0xac, 0x69, 0xdc, 0x2a, 0xdf, 0x6e, + 0x6c, 0x76, 0xaf, 0xee, 0x07, 0x01, 0xf8, 0x40, 0x82, 0x75, 0x1a, 0xe3, 0xb3, 0xd6, 0x92, 0xfa, + 0xcf, 0x70, 0xa2, 0xc1, 0xfc, 0xbd, 0x01, 0x90, 0x09, 0x89, 0x53, 0x47, 0x84, 0x9f, 0x14, 0x4f, + 0x7d, 0x48, 0xf8, 0x09, 0x96, 0x1c, 0xf4, 0x1e, 0x54, 0xf8, 0x28, 0x4a, 0x0e, 0xdc, 0x4c, 0x24, + 0x9e, 0x8e, 0x22, 0xfa, 0xea, 0xac, 0x55, 0xfb, 0xd8, 0x7e, 0x7c, 0x20, 0xfe, 0x63, 0x29, 0x85, + 0xbe, 0x03, 0xd5, 0x21, 0xf1, 0x07, 0x54, 0x1f, 0x7a, 0x45, 0x8b, 0x57, 0x9f, 0x09, 0x22, 0x56, + 0x3c, 0xf3, 0x2f, 0x25, 0x58, 0xbd, 0x2f, 0x0e, 0xd2, 0xa5, 0x11, 0x0d, 0x5c, 0x1a, 0x38, 0xa3, + 0x19, 0xdc, 0xff, 0x1e, 0xd4, 0x5c, 0x4a, 0xdc, 0xf4, 0x79, 0x94, 0x3b, 0x6b, 0x5a, 0xaa, 0xd6, + 0xd5, 0x74, 0x9c, 0x4a, 0xa0, 0x5f, 0x67, 0x4e, 0x55, 0x2f, 0xe5, 0xf1, 0xd5, 0x9d, 0x5a, 0xb0, + 0x55, 0xfb, 0x77, 0x55, 0x6b, 0x9f, 0xf2, 0xb1, 0x08, 0x14, 0x27, 0x0c, 0x02, 0xea, 0x70, 0xea, + 0xca, 0x27, 0x54, 0xcb, 0x02, 0x65, 0x27, 0x61, 0xe0, 0x4c, 0xc6, 0x7c, 0x59, 0x82, 0x9b, 0xe7, + 0x2a, 0x99, 0xc1, 0x2d, 0x47, 0x50, 0x11, 0x19, 0x4f, 0xba, 0x64, 0xae, 0xd0, 0x79, 0xea, 0xf5, + 0xa9, 0x3e, 0x9a, 0xcc, 0x06, 0x62, 0x8d, 0x25, 0x36, 0x72, 0x61, 0xc9, 0x09, 0x03, 0x4e, 0xbf, + 0xe0, 0xda, 0x99, 0x3f, 0xbe, 0x74, 0xc6, 0x93, 0xc7, 0xdb, 0x51, 0x20, 0x2a, 0x34, 0xf5, 0x02, + 0x27, 0xd0, 0xe8, 0x17, 0x50, 0x71, 0x09, 0x27, 0x3a, 0xe9, 0xfc, 0x64, 0xbe, 0x47, 0xa0, 0xce, + 0x20, 0xfe, 0x61, 0x89, 0x6a, 0xfe, 0xbd, 0x04, 0x2b, 0xd2, 0x88, 0x43, 0x91, 0xd4, 0x9d, 0xd0, + 0x47, 0x54, 0x47, 0xb6, 0xf2, 0xed, 0x93, 0x42, 0x64, 0x6f, 0x5f, 0xb2, 0xba, 0x5a, 0x13, 0xe0, + 0xb9, 0x27, 0xf1, 0x1c, 0x2a, 0x27, 0x9c, 0x47, 0xfa, 0x82, 0xe6, 0x38, 0xd6, 0x43, 0xce, 0xa3, + 0x2c, 0x04, 0xc4, 0x0a, 0x4b, 0x64, 0xa1, 0x21, 0x20, 0x3c, 0x09, 0xf4, 0x39, 0x34, 0x1c, 0x10, + 0xce, 0xf2, 0x41, 0xc6, 0x19, 0x96, 0xc8, 0xe6, 0x1d, 0x58, 0xce, 0x97, 0x8b, 0xd7, 0xa7, 0x0d, + 0xf3, 0x4f, 0x06, 0xac, 0x7d, 0x14, 0x87, 0x83, 0xe8, 0x19, 0x8d, 0x99, 0x17, 0x06, 0x7b, 0x5e, + 0xe0, 0x8a, 0xec, 0xd0, 0x13, 0x34, 0xbd, 0x2f, 0xcd, 0x0e, 0x52, 0x10, 0x2b, 0x1e, 0xfa, 0x2e, + 0x2c, 0x0d, 0xd5, 0x1e, 0x9d, 0x73, 0xd2, 0x87, 0xa6, 0xa1, 0x70, 0xc2, 0x17, 0x66, 0x9c, 0x7a, + 0x81, 0xab, 0x93, 0x4d, 0x6a, 0x86, 0xd0, 0x85, 0x25, 0xc7, 0xbc, 0x0d, 0xd2, 0x51, 0xd2, 0xe0, + 0x30, 0xe6, 0x53, 0x06, 0x87, 0x31, 0xc7, 0x92, 0x63, 0xfe, 0xaf, 0x02, 0xf2, 0xc4, 0x22, 0x6b, + 0x8b, 0xd2, 0x67, 0x4c, 0x66, 0xed, 0xb4, 0x6e, 0xd9, 0x70, 0x93, 0x71, 0x12, 0xf3, 0x4f, 0x3d, + 0x7e, 0xb2, 0x4f, 0x18, 0xc7, 0xd4, 0xa1, 0xde, 0x90, 0xba, 0xd2, 0xd8, 0x5a, 0xe7, 0x5d, 0xbd, + 0xe1, 0xa6, 0x7d, 0x9e, 0x10, 0x3e, 0x7f, 0x2f, 0x7a, 0x04, 0x37, 0x5c, 0xea, 0x7b, 0x43, 0x1a, + 0x6f, 0xfb, 0xfe, 0xf6, 0x90, 0x78, 0x3e, 0x39, 0xd2, 0x35, 0xbe, 0xd6, 0x79, 0x47, 0x43, 0xde, + 0xe8, 0x4e, 0x8b, 0xe0, 0xf3, 0xf6, 0xa1, 0x6d, 0x58, 0x95, 0x7a, 0xb6, 0xb9, 0x4d, 0x7f, 0x35, + 0xa0, 0x81, 0x43, 0xe5, 0xa3, 0xaa, 0x77, 0xde, 0xd6, 0x50, 0xab, 0xf6, 0x24, 0x1b, 0x17, 0xe5, + 0xd1, 0x07, 0xd0, 0xd0, 0x24, 0x91, 0x07, 0x64, 0x81, 0xae, 0x77, 0x6e, 0xe8, 0xed, 0x0d, 0x3b, + 0x63, 0xe1, 0xbc, 0x1c, 0xea, 0xc2, 0x5a, 0x6e, 0xd9, 0xa5, 0x3e, 0x27, 0xcd, 0xc5, 0x89, 0xca, + 0xb1, 0x66, 0x17, 0xf8, 0x78, 0x6a, 0x87, 0x08, 0x01, 0x77, 0x10, 0x4b, 0x17, 0x2c, 0x49, 0x17, + 0xa4, 0x21, 0xd0, 0x55, 0x64, 0x9c, 0xf0, 0x65, 0xae, 0xf5, 0x07, 0x8c, 0xd3, 0x78, 0xd7, 0x6d, + 0xd6, 0x26, 0x8b, 0xf2, 0x4e, 0xc2, 0xc0, 0x99, 0x8c, 0x28, 0x23, 0x8e, 0xef, 0xd1, 0x80, 0xef, + 0xba, 0xcd, 0xba, 0x94, 0x4f, 0xcb, 0xc8, 0x8e, 0xa6, 0xe3, 0x54, 0x42, 0xe4, 0x24, 0x99, 0x23, + 0x40, 0x4a, 0x3e, 0x2c, 0xe4, 0x88, 0x7b, 0x97, 0xcd, 0x11, 0x22, 0xc0, 0xb2, 0xd4, 0x60, 0xfe, + 0xad, 0x02, 0x70, 0x10, 0xba, 0xd4, 0xe6, 0x84, 0x0f, 0x18, 0x5a, 0x87, 0x92, 0xe7, 0xea, 0xc0, + 0x03, 0xad, 0xaa, 0xb4, 0xdb, 0xc5, 0x25, 0xcf, 0x4d, 0x0b, 0x41, 0xe9, 0xc2, 0x42, 0xf0, 0x01, + 0x34, 0x5c, 0x8f, 0x45, 0x3e, 0x19, 0x09, 0xa2, 0x7e, 0x13, 0xe9, 0x8d, 0x75, 0x33, 0x16, 0xce, + 0xcb, 0xa5, 0xf5, 0xbd, 0x72, 0x7e, 0x7d, 0x17, 0xe6, 0xe5, 0x92, 0xd9, 0x1d, 0xa8, 0x46, 0x27, + 0x84, 0x25, 0x01, 0xb1, 0x9e, 0xbc, 0xe0, 0x43, 0x41, 0x7c, 0x25, 0x1a, 0xa1, 0xd0, 0xa5, 0x72, + 0x81, 0x95, 0x20, 0x7a, 0x0e, 0x75, 0x79, 0xbf, 0xd4, 0xdd, 0xe6, 0x32, 0x14, 0x1a, 0x9b, 0x6d, + 0x4b, 0xb5, 0xe1, 0x56, 0xbe, 0x0d, 0xcf, 0xb2, 0x92, 0x98, 0x12, 0xac, 0xe1, 0x5d, 0xeb, 0x91, + 0xe7, 0xc4, 0xa1, 0x08, 0x8a, 0xec, 0x46, 0xed, 0x04, 0x09, 0x67, 0xa0, 0xe8, 0x18, 0x1a, 0x4e, + 0xd8, 0x8f, 0x7c, 0xaa, 0x74, 0x2c, 0x5d, 0x4d, 0x47, 0xea, 0xa9, 0x9d, 0x0c, 0x0b, 0xe7, 0x81, + 0x45, 0x54, 0xf6, 0x29, 0x63, 0xa4, 0x47, 0x75, 0xa0, 0xa5, 0x51, 0xf9, 0x48, 0x91, 0x71, 0xc2, + 0x47, 0x9f, 0x42, 0x55, 0x46, 0x80, 0x8c, 0xb0, 0xc6, 0xe6, 0x87, 0x57, 0x2b, 0x97, 0x9d, 0xba, + 0x70, 0xad, 0xfc, 0x8b, 0x15, 0x9e, 0xf9, 0x87, 0x2a, 0x5c, 0xc3, 0x94, 0x85, 0x83, 0xd8, 0xa1, + 0x8f, 0x8f, 0x3e, 0xa7, 0x0e, 0x9f, 0x6c, 0x4b, 0x8d, 0x19, 0xda, 0xd2, 0xdf, 0xc0, 0xa2, 0x4f, + 0x8e, 0xa8, 0x2f, 0x0a, 0x86, 0x68, 0x37, 0x9f, 0x5e, 0xbd, 0x60, 0x4c, 0x9a, 0x62, 0xed, 0x4b, + 0xd8, 0xfb, 0x01, 0x8f, 0x47, 0x9d, 0x6b, 0xda, 0x86, 0x45, 0x45, 0xc4, 0x5a, 0x27, 0xfa, 0x1d, + 0x40, 0x44, 0x62, 0xd2, 0xa7, 0xb2, 0x37, 0xab, 0x48, 0x0b, 0xf6, 0xe6, 0xb7, 0xe0, 0x30, 0xc1, + 0xec, 0x20, 0xad, 0x18, 0x52, 0x12, 0xc3, 0x39, 0x95, 0xe8, 0x2b, 0x03, 0xd6, 0x7a, 0x85, 0xca, + 0xa4, 0x07, 0x90, 0x8f, 0xaf, 0x6e, 0x47, 0xb1, 0xd6, 0x65, 0xf9, 0xae, 0xc8, 0xc1, 0x53, 0xda, + 0x51, 0x0c, 0x8b, 0xea, 0x14, 0xfa, 0x81, 0xcc, 0x61, 0x47, 0x71, 0x50, 0xcd, 0xee, 0xc1, 0x96, + 0x1a, 0xb0, 0xd6, 0xb4, 0xfe, 0x03, 0x68, 0xe4, 0xae, 0x0b, 0xad, 0xa9, 0x59, 0x45, 0xc6, 0x8f, + 0x1c, 0x4f, 0xd0, 0x5b, 0x49, 0x2b, 0x2f, 0x53, 0x8e, 0xee, 0xdd, 0x7f, 0x58, 0xba, 0x67, 0x98, + 0x7f, 0x35, 0xe0, 0xfa, 0x94, 0xdf, 0x91, 0x0f, 0x65, 0x16, 0x3b, 0x7a, 0x24, 0x7e, 0xf2, 0x06, + 0x6f, 0x54, 0x19, 0xae, 0xc6, 0x47, 0x3b, 0x76, 0xb0, 0x50, 0x23, 0xf2, 0xa1, 0x4b, 0x19, 0x2f, + 0xe6, 0xc3, 0x2e, 0x65, 0x1c, 0x4b, 0x8e, 0x98, 0x74, 0xde, 0xbe, 0x00, 0x4b, 0x34, 0x22, 0xea, + 0x7d, 0x16, 0x1a, 0x91, 0xfc, 0x5b, 0x4b, 0x9b, 0x9c, 0xd2, 0x85, 0xb3, 0x51, 0x6b, 0x72, 0xda, + 0xa9, 0x4f, 0x4d, 0x3a, 0xab, 0xb0, 0x82, 0x29, 0x8f, 0x47, 0x36, 0x8f, 0x09, 0xa7, 0xbd, 0x91, + 0xf9, 0x8f, 0x12, 0x2c, 0xda, 0xf2, 0xc0, 0xe8, 0x39, 0xd4, 0x44, 0x16, 0x92, 0x2d, 0xaf, 0x72, + 0xda, 0x9d, 0xd9, 0x72, 0x96, 0x7a, 0x6c, 0x8f, 0x28, 0x27, 0x59, 0xac, 0x67, 0x34, 0x9c, 0xa2, + 0xa2, 0x63, 0xa8, 0xb0, 0x88, 0x3a, 0xf3, 0x8f, 0x06, 0xca, 0x62, 0x3b, 0xa2, 0x4e, 0xe6, 0x06, + 0xb1, 0xc2, 0x12, 0x1f, 0x05, 0xb0, 0xc8, 0x64, 0x05, 0x9b, 0xff, 0xa3, 0x84, 0xd6, 0x24, 0xd1, + 0x72, 0xa1, 0x2b, 0xd7, 0x58, 0x6b, 0x31, 0xff, 0x69, 0x00, 0x28, 0xc1, 0x7d, 0x8f, 0x89, 0xb9, + 0xa1, 0xe8, 0x48, 0x6b, 0x36, 0x47, 0x8a, 0xdd, 0xd2, 0x8d, 0x69, 0x07, 0x90, 0x50, 0x72, 0x4e, + 0xa4, 0x50, 0xf5, 0x38, 0xed, 0xb3, 0x66, 0x49, 0xa6, 0xaa, 0x9f, 0xcd, 0x7b, 0xb6, 0x2c, 0xd8, + 0x76, 0x05, 0x2c, 0x56, 0xe8, 0xe6, 0xbf, 0xca, 0xc9, 0x99, 0x84, 0x63, 0xd1, 0x1f, 0x0d, 0x58, + 0x76, 0x93, 0x61, 0xd0, 0xa3, 0xc9, 0x97, 0x81, 0xdd, 0x37, 0x36, 0xc4, 0x76, 0xde, 0xd2, 0x66, + 0x2c, 0x77, 0x73, 0x6a, 0xf0, 0x84, 0x52, 0x14, 0x42, 0x8d, 0xc7, 0x5e, 0xaf, 0x27, 0x32, 0xb5, + 0x3a, 0xfe, 0xf6, 0x1c, 0xf3, 0xa5, 0x42, 0xca, 0x9c, 0xad, 0x09, 0x0c, 0xa7, 0x4a, 0xd0, 0x1e, + 0x80, 0x4b, 0x23, 0x3f, 0x1c, 0x09, 0x27, 0xe8, 0x68, 0x7a, 0x27, 0x77, 0x99, 0x96, 0x13, 0xc6, + 0x54, 0x5c, 0xdd, 0x61, 0xe8, 0xca, 0x70, 0xbc, 0x26, 0x82, 0xbf, 0x9b, 0x6e, 0xc1, 0xb9, 0xed, + 0xe8, 0x4b, 0x03, 0x56, 0x68, 0x7e, 0x28, 0xd3, 0x93, 0xe5, 0x47, 0x73, 0x3a, 0x31, 0x81, 0xeb, + 0x5c, 0x1f, 0x9f, 0xb5, 0x26, 0x67, 0x4a, 0x3c, 0xa9, 0xd0, 0xfc, 0x6f, 0x05, 0x96, 0xf3, 0x21, + 0x9d, 0xf5, 0x4f, 0xc6, 0xac, 0xfd, 0xd3, 0xcf, 0xf3, 0xfd, 0x93, 0x7a, 0xc9, 0xdf, 0x9b, 0x2d, + 0xbc, 0x67, 0x68, 0x9d, 0xc8, 0x64, 0xeb, 0x54, 0xbe, 0x34, 0xfc, 0xa5, 0xba, 0xa6, 0xca, 0x6b, + 0xba, 0xa6, 0x21, 0x54, 0x83, 0xd0, 0xa5, 0xac, 0x59, 0x95, 0xb1, 0xf6, 0xe4, 0xcd, 0xa4, 0x11, + 0x4b, 0xb8, 0x54, 0x37, 0x25, 0xe9, 0xdb, 0x93, 0x34, 0xac, 0xd4, 0x89, 0x71, 0x49, 0x5b, 0xec, + 0x85, 0xc1, 0x4e, 0x38, 0x08, 0x54, 0xa3, 0x5a, 0xcd, 0xc6, 0xa5, 0x9d, 0x49, 0x36, 0x2e, 0xca, + 0xaf, 0xff, 0x56, 0x35, 0xf2, 0x17, 0x16, 0xd3, 0xcf, 0xf2, 0xc5, 0x74, 0xae, 0x5c, 0x9c, 0xcd, + 0x0b, 0xf9, 0x92, 0x6c, 0x03, 0x64, 0xdf, 0x6f, 0x44, 0x79, 0x93, 0x77, 0x5c, 0x2c, 0x6f, 0x32, + 0x06, 0xb0, 0xe2, 0x89, 0xf2, 0xc6, 0x78, 0x18, 0x15, 0xcb, 0x9b, 0xcd, 0xc3, 0x08, 0x4b, 0x8e, + 0xf9, 0x75, 0x09, 0x96, 0xf4, 0x23, 0x9d, 0xe1, 0x43, 0x54, 0x0c, 0xb5, 0x58, 0x97, 0x5b, 0x7d, + 0xca, 0x87, 0x6f, 0xaa, 0xb1, 0xec, 0x2c, 0x8b, 0x7c, 0x91, 0xd0, 0x70, 0xaa, 0x27, 0x1f, 0x5c, + 0xe5, 0xd7, 0x04, 0x97, 0xc8, 0x06, 0x31, 0x8d, 0xfc, 0xb4, 0x16, 0xcf, 0x9f, 0x0d, 0x26, 0x4a, + 0xbb, 0xca, 0x06, 0x13, 0x24, 0x3c, 0xa9, 0xd0, 0x74, 0xa0, 0x91, 0xfb, 0x1e, 0x3e, 0xc3, 0xb7, + 0xd7, 0x4d, 0x80, 0x21, 0x8d, 0xbd, 0xe3, 0xd1, 0x0e, 0x8d, 0xb9, 0xfe, 0xc0, 0x90, 0x96, 0xfc, + 0x67, 0x29, 0x07, 0xe7, 0xa4, 0x3a, 0xd6, 0x8b, 0x97, 0x1b, 0x0b, 0xdf, 0xbc, 0xdc, 0x58, 0xf8, + 0xf6, 0xe5, 0xc6, 0xc2, 0x97, 0xe3, 0x0d, 0xe3, 0xc5, 0x78, 0xc3, 0xf8, 0x66, 0xbc, 0x61, 0x7c, + 0x3b, 0xde, 0x30, 0xfe, 0x3d, 0xde, 0x30, 0xbe, 0xfa, 0xcf, 0xc6, 0xc2, 0x67, 0xb5, 0xe4, 0x10, + 0xff, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x1c, 0x71, 0x44, 0x0b, 0xca, 0x1a, 0x00, 0x00, } diff --git a/pkg/apis/sensor/v1alpha1/generated.proto b/pkg/apis/sensor/v1alpha1/generated.proto index 80fd25c6a5..e68c8d8f4e 100644 --- a/pkg/apis/sensor/v1alpha1/generated.proto +++ b/pkg/apis/sensor/v1alpha1/generated.proto @@ -19,6 +19,7 @@ syntax = 'proto2'; package github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1; +import "github.com/argoproj/argo-events/pkg/apis/common/generated.proto"; import "k8s.io/api/core/v1/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; @@ -30,7 +31,7 @@ option go_package = "v1alpha1"; // ArtifactLocation describes the source location for an external artifact message ArtifactLocation { - optional S3Artifact s3 = 1; + optional github.com.argoproj.argo_events.pkg.apis.common.S3Artifact s3 = 1; optional string inline = 2; @@ -79,55 +80,6 @@ message DataFilter { optional string value = 3; } -// Event is a data record expressing an occurrence and its context. -// Adheres to the CloudEvents v0.1 specification -message Event { - optional EventContext context = 1; - - optional bytes data = 2; -} - -// EventContext contains metadata that provides circumstantial information about the occurrence. -message EventContext { - // The type of occurrence which has happened. Often this attribute is used for - // routing, observability, policy enforcement, etc. - // should be prefixed with a reverse-DNS name. The prefixed domain dictates - // the organization which defines the semantics of this event type. ex: com.github.pull.create - optional string eventType = 1; - - // The version of the eventType. Enables the interpretation of data by eventual consumers, - // requires the consumer to be knowledgeable about the producer. - optional string eventTypeVersion = 2; - - // The version of the CloudEvents specification which the event uses. - // Enables the interpretation of the context. - optional string cloudEventsVersion = 3; - - // This describes the event producer. - optional URI source = 4; - - // ID of the event. The semantics are explicitly undefined to ease the implementation of producers. - // Enables deduplication. Must be unique within scope of producer. - optional string eventID = 5; - - optional k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime eventTime = 6; - - // A link to the schema that the data attribute adheres to. - // Must adhere to the format specified in RFC 3986. - optional URI schemaURL = 7; - - // Content type of the data attribute value. Enables the data attribute to carry any type of content, - // whereby format and encoding might differ from that of the chosen event format. - // For example, the data attribute may carry an XML or JSON payload and the consumer is informed - // by this attribute being set to "application/xml" or "application/json" respectively. - optional string contentType = 8; - - // This is for additional metadata and does not have a mandated structure. - // Enables a place for custom fields a producer or middleware might want to include and provides a place - // to test metadata before adding them to the CloudEvents specification. - map extensions = 9; -} - // EventDependency describes a dependency message EventDependency { // Name is a unique name of this dependency @@ -156,7 +108,7 @@ message EventDependencyFilter { optional TimeFilter time = 2; // Context filter constraints with escalation - optional EventContext context = 3; + optional github.com.argoproj.argo_events.pkg.apis.common.EventContext context = 3; // Data filter constraints with escalation optional Data data = 4; @@ -257,7 +209,7 @@ message NodeStatus { optional string message = 8; // Event stores the last seen event for this node - optional Event event = 9; + optional github.com.argoproj.argo_events.pkg.apis.common.Event event = 9; } // ResourceObject is the resource object to create on kubernetes @@ -314,39 +266,6 @@ message ResourceParameterSource { message RetryStrategy { } -// S3Artifact contains information about an artifact in S3 -message S3Artifact { - optional S3Bucket s3Bucket = 4; - - optional string key = 1; - - optional string event = 2; - - optional S3Filter filter = 3; -} - -// S3Bucket contains information for an S3 Bucket -message S3Bucket { - optional string endpoint = 1; - - optional string bucket = 2; - - optional string region = 3; - - optional bool insecure = 4; - - optional k8s.io.api.core.v1.SecretKeySelector accessKey = 5; - - optional k8s.io.api.core.v1.SecretKeySelector secretKey = 6; -} - -// S3Filter represents filters to apply to bucket nofifications for specifying constraints on objects -message S3Filter { - optional string prefix = 1; - - optional string suffix = 2; -} - // Sensor is the definition of a sensor resource // +genclient // +genclient:noStatus @@ -436,25 +355,6 @@ message Trigger { optional RetryStrategy replyStrategy = 4; } -// URI is a Uniform Resource Identifier based on RFC 3986 -message URI { - optional string scheme = 1; - - optional string user = 2; - - optional string password = 3; - - optional string host = 4; - - optional int32 port = 5; - - optional string path = 6; - - optional string query = 7; - - optional string fragment = 8; -} - // URLArtifact contains information about an artifact at an http endpoint. message URLArtifact { optional string path = 1; diff --git a/pkg/apis/sensor/v1alpha1/openapi_generated.go b/pkg/apis/sensor/v1alpha1/openapi_generated.go index b3a205e29a..0fcbd23734 100644 --- a/pkg/apis/sensor/v1alpha1/openapi_generated.go +++ b/pkg/apis/sensor/v1alpha1/openapi_generated.go @@ -32,8 +32,6 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.ConfigmapArtifact": schema_pkg_apis_sensor_v1alpha1_ConfigmapArtifact(ref), "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.Data": schema_pkg_apis_sensor_v1alpha1_Data(ref), "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.DataFilter": schema_pkg_apis_sensor_v1alpha1_DataFilter(ref), - "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.Event": schema_pkg_apis_sensor_v1alpha1_Event(ref), - "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EventContext": schema_pkg_apis_sensor_v1alpha1_EventContext(ref), "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EventDependency": schema_pkg_apis_sensor_v1alpha1_EventDependency(ref), "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EventDependencyFilter": schema_pkg_apis_sensor_v1alpha1_EventDependencyFilter(ref), "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EventProtocol": schema_pkg_apis_sensor_v1alpha1_EventProtocol(ref), @@ -46,16 +44,12 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.ResourceParameter": schema_pkg_apis_sensor_v1alpha1_ResourceParameter(ref), "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.ResourceParameterSource": schema_pkg_apis_sensor_v1alpha1_ResourceParameterSource(ref), "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.RetryStrategy": schema_pkg_apis_sensor_v1alpha1_RetryStrategy(ref), - "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.S3Artifact": schema_pkg_apis_sensor_v1alpha1_S3Artifact(ref), - "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.S3Bucket": schema_pkg_apis_sensor_v1alpha1_S3Bucket(ref), - "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.S3Filter": schema_pkg_apis_sensor_v1alpha1_S3Filter(ref), "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.Sensor": schema_pkg_apis_sensor_v1alpha1_Sensor(ref), "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.SensorList": schema_pkg_apis_sensor_v1alpha1_SensorList(ref), "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.SensorSpec": schema_pkg_apis_sensor_v1alpha1_SensorSpec(ref), "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.SensorStatus": schema_pkg_apis_sensor_v1alpha1_SensorStatus(ref), "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.TimeFilter": schema_pkg_apis_sensor_v1alpha1_TimeFilter(ref), "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.Trigger": schema_pkg_apis_sensor_v1alpha1_Trigger(ref), - "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.URI": schema_pkg_apis_sensor_v1alpha1_URI(ref), "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.URLArtifact": schema_pkg_apis_sensor_v1alpha1_URLArtifact(ref), } } @@ -69,7 +63,7 @@ func schema_pkg_apis_sensor_v1alpha1_ArtifactLocation(ref common.ReferenceCallba Properties: map[string]spec.Schema{ "s3": { SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.S3Artifact"), + Ref: ref("github.com/argoproj/argo-events/pkg/apis/common.S3Artifact"), }, }, "inline": { @@ -97,7 +91,7 @@ func schema_pkg_apis_sensor_v1alpha1_ArtifactLocation(ref common.ReferenceCallba }, }, Dependencies: []string{ - "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.ConfigmapArtifact", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.FileArtifact", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.S3Artifact", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.URLArtifact"}, + "github.com/argoproj/argo-events/pkg/apis/common.S3Artifact", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.ConfigmapArtifact", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.FileArtifact", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.URLArtifact"}, } } @@ -201,115 +195,6 @@ func schema_pkg_apis_sensor_v1alpha1_DataFilter(ref common.ReferenceCallback) co } } -func schema_pkg_apis_sensor_v1alpha1_Event(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "Event is a data record expressing an occurrence and its context. Adheres to the CloudEvents v0.1 specification", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "context": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EventContext"), - }, - }, - "payload": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "byte", - }, - }, - }, - Required: []string{"context", "payload"}, - }, - }, - Dependencies: []string{ - "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EventContext"}, - } -} - -func schema_pkg_apis_sensor_v1alpha1_EventContext(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "EventContext contains metadata that provides circumstantial information about the occurrence.", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "eventType": { - SchemaProps: spec.SchemaProps{ - Description: "The type of occurrence which has happened. Often this attribute is used for routing, observability, policy enforcement, etc. should be prefixed with a reverse-DNS name. The prefixed domain dictates the organization which defines the semantics of this event type. ex: com.github.pull.create", - Type: []string{"string"}, - Format: "", - }, - }, - "eventTypeVersion": { - SchemaProps: spec.SchemaProps{ - Description: "The version of the eventType. Enables the interpretation of data by eventual consumers, requires the consumer to be knowledgeable about the producer.", - Type: []string{"string"}, - Format: "", - }, - }, - "cloudEventsVersion": { - SchemaProps: spec.SchemaProps{ - Description: "The version of the CloudEvents specification which the event uses. Enables the interpretation of the context.", - Type: []string{"string"}, - Format: "", - }, - }, - "source": { - SchemaProps: spec.SchemaProps{ - Description: "This describes the event producer.", - Ref: ref("github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.URI"), - }, - }, - "eventID": { - SchemaProps: spec.SchemaProps{ - Description: "ID of the event. The semantics are explicitly undefined to ease the implementation of producers. Enables deduplication. Must be unique within scope of producer.", - Type: []string{"string"}, - Format: "", - }, - }, - "eventTime": { - SchemaProps: spec.SchemaProps{ - Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.MicroTime"), - }, - }, - "schemaURL": { - SchemaProps: spec.SchemaProps{ - Description: "A link to the schema that the data attribute adheres to. Must adhere to the format specified in RFC 3986.", - Ref: ref("github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.URI"), - }, - }, - "contentType": { - SchemaProps: spec.SchemaProps{ - Description: "Content type of the data attribute value. Enables the data attribute to carry any type of content, whereby format and encoding might differ from that of the chosen event format. For example, the data attribute may carry an XML or JSON payload and the consumer is informed by this attribute being set to \"application/xml\" or \"application/json\" respectively.", - Type: []string{"string"}, - Format: "", - }, - }, - "extensions": { - SchemaProps: spec.SchemaProps{ - Description: "This is for additional metadata and does not have a mandated structure. Enables a place for custom fields a producer or middleware might want to include and provides a place to test metadata before adding them to the CloudEvents specification.", - Type: []string{"object"}, - AdditionalProperties: &spec.SchemaOrBool{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - }, - }, - }, - }, - Required: []string{"eventType", "eventTypeVersion", "cloudEventsVersion", "source", "eventID", "eventTime", "schemaURL", "contentType"}, - }, - }, - Dependencies: []string{ - "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.URI", "k8s.io/apimachinery/pkg/apis/meta/v1.MicroTime"}, - } -} - func schema_pkg_apis_sensor_v1alpha1_EventDependency(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -376,7 +261,7 @@ func schema_pkg_apis_sensor_v1alpha1_EventDependencyFilter(ref common.ReferenceC "context": { SchemaProps: spec.SchemaProps{ Description: "Context filter constraints with escalation", - Ref: ref("github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EventContext"), + Ref: ref("github.com/argoproj/argo-events/pkg/apis/common.EventContext"), }, }, "data": { @@ -390,7 +275,7 @@ func schema_pkg_apis_sensor_v1alpha1_EventDependencyFilter(ref common.ReferenceC }, }, Dependencies: []string{ - "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.Data", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EventContext", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.TimeFilter"}, + "github.com/argoproj/argo-events/pkg/apis/common.EventContext", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.Data", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.TimeFilter"}, } } @@ -653,7 +538,7 @@ func schema_pkg_apis_sensor_v1alpha1_NodeStatus(ref common.ReferenceCallback) co "event": { SchemaProps: spec.SchemaProps{ Description: "Event stores the last seen event for this node", - Ref: ref("github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.Event"), + Ref: ref("github.com/argoproj/argo-events/pkg/apis/common.Event"), }, }, }, @@ -661,7 +546,7 @@ func schema_pkg_apis_sensor_v1alpha1_NodeStatus(ref common.ReferenceCallback) co }, }, Dependencies: []string{ - "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.Event", "k8s.io/apimachinery/pkg/apis/meta/v1.MicroTime"}, + "github.com/argoproj/argo-events/pkg/apis/common.Event", "k8s.io/apimachinery/pkg/apis/meta/v1.MicroTime"}, } } @@ -817,114 +702,6 @@ func schema_pkg_apis_sensor_v1alpha1_RetryStrategy(ref common.ReferenceCallback) } } -func schema_pkg_apis_sensor_v1alpha1_S3Artifact(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "S3Artifact contains information about an artifact in S3", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "key": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "event": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "filter": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.S3Filter"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.S3Filter"}, - } -} - -func schema_pkg_apis_sensor_v1alpha1_S3Bucket(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "S3Bucket contains information for an S3 Bucket", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "endpoint": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "bucket": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "region": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "insecure": { - SchemaProps: spec.SchemaProps{ - Type: []string{"boolean"}, - Format: "", - }, - }, - "accessKey": { - SchemaProps: spec.SchemaProps{ - Ref: ref("k8s.io/api/core/v1.SecretKeySelector"), - }, - }, - "secretKey": { - SchemaProps: spec.SchemaProps{ - Ref: ref("k8s.io/api/core/v1.SecretKeySelector"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "k8s.io/api/core/v1.SecretKeySelector"}, - } -} - -func schema_pkg_apis_sensor_v1alpha1_S3Filter(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "S3Filter represents filters to apply to bucket nofifications for specifying constraints on objects", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "prefix": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "suffix": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - }, - Required: []string{"prefix", "suffix"}, - }, - }, - Dependencies: []string{}, - } -} - func schema_pkg_apis_sensor_v1alpha1_Sensor(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -1203,69 +980,6 @@ func schema_pkg_apis_sensor_v1alpha1_Trigger(ref common.ReferenceCallback) commo } } -func schema_pkg_apis_sensor_v1alpha1_URI(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Description: "URI is a Uniform Resource Identifier based on RFC 3986", - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "scheme": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "user": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "password": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "host": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "port": { - SchemaProps: spec.SchemaProps{ - Type: []string{"integer"}, - Format: "int32", - }, - }, - "path": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "query": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - "fragment": { - SchemaProps: spec.SchemaProps{ - Type: []string{"string"}, - Format: "", - }, - }, - }, - Required: []string{"scheme", "user", "password", "host", "port", "path", "query", "fragment"}, - }, - }, - Dependencies: []string{}, - } -} - func schema_pkg_apis_sensor_v1alpha1_URLArtifact(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ diff --git a/pkg/apis/sensor/v1alpha1/types.go b/pkg/apis/sensor/v1alpha1/types.go index 3cb8df74e3..4c62890aaf 100644 --- a/pkg/apis/sensor/v1alpha1/types.go +++ b/pkg/apis/sensor/v1alpha1/types.go @@ -18,10 +18,10 @@ package v1alpha1 import ( "fmt" - "github.com/argoproj/argo-events/pkg/common" + "github.com/argoproj/argo-events/pkg/apis/common" + apicommon "github.com/argoproj/argo-events/pkg/apis/common" "hash/fnv" - "github.com/minio/minio-go" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -176,7 +176,7 @@ type EventDependencyFilter struct { Time *TimeFilter `json:"time,omitempty" protobuf:"bytes,2,opt,name=time"` // Context filter constraints with escalation - Context *EventContext `json:"context,omitempty" protobuf:"bytes,3,opt,name=context"` + Context *common.EventContext `json:"context,omitempty" protobuf:"bytes,3,opt,name=context"` // Data filter constraints with escalation Data *Data `json:"data,omitempty" protobuf:"bytes,4,rep,name=data"` @@ -354,102 +354,16 @@ type NodeStatus struct { Message string `json:"message,omitempty" protobuf:"bytes,8,opt,name=message"` // Event stores the last seen event for this node - Event *Event `json:"event,omitempty" protobuf:"bytes,9,opt,name=event"` -} - -// Event is a data record expressing an occurrence and its context. -// Adheres to the CloudEvents v0.1 specification -type Event struct { - Context EventContext `json:"context" protobuf:"bytes,1,opt,name=context"` - Payload []byte `json:"payload" protobuf:"bytes,2,opt,name=data"` -} - -// EventContext contains metadata that provides circumstantial information about the occurrence. -type EventContext struct { - // The type of occurrence which has happened. Often this attribute is used for - // routing, observability, policy enforcement, etc. - // should be prefixed with a reverse-DNS name. The prefixed domain dictates - // the organization which defines the semantics of this event type. ex: com.github.pull.create - EventType string `json:"eventType" protobuf:"bytes,1,opt,name=eventType"` - - // The version of the eventType. Enables the interpretation of data by eventual consumers, - // requires the consumer to be knowledgeable about the producer. - EventTypeVersion string `json:"eventTypeVersion" protobuf:"bytes,2,opt,name=eventTypeVersion"` - - // The version of the CloudEvents specification which the event uses. - // Enables the interpretation of the context. - CloudEventsVersion string `json:"cloudEventsVersion" protobuf:"bytes,3,opt,name=cloudEventsVersion"` - - // This describes the event producer. - Source *URI `json:"source" protobuf:"bytes,4,opt,name=source"` - - // ID of the event. The semantics are explicitly undefined to ease the implementation of producers. - // Enables deduplication. Must be unique within scope of producer. - EventID string `json:"eventID" protobuf:"bytes,5,opt,name=eventID"` - - // Timestamp of when the event happened. Must adhere to format specified in RFC 3339. - - EventTime v1.MicroTime `json:"eventTime" protobuf:"bytes,6,opt,name=eventTime"` - - // A link to the schema that the data attribute adheres to. - // Must adhere to the format specified in RFC 3986. - SchemaURL *URI `json:"schemaURL" protobuf:"bytes,7,opt,name=schemaURL"` - - // Content type of the data attribute value. Enables the data attribute to carry any type of content, - // whereby format and encoding might differ from that of the chosen event format. - // For example, the data attribute may carry an XML or JSON payload and the consumer is informed - // by this attribute being set to "application/xml" or "application/json" respectively. - ContentType string `json:"contentType" protobuf:"bytes,8,opt,name=contentType"` - - // This is for additional metadata and does not have a mandated structure. - // Enables a place for custom fields a producer or middleware might want to include and provides a place - // to test metadata before adding them to the CloudEvents specification. - Extensions map[string]string `json:"extensions,omitempty" protobuf:"bytes,9,rep,name=extensions"` -} - -// URI is a Uniform Resource Identifier based on RFC 3986 -type URI struct { - Scheme string `json:"scheme" protobuf:"bytes,1,opt,name=scheme"` - User string `json:"user" protobuf:"bytes,2,opt,name=user"` - Password string `json:"password" protobuf:"bytes,3,opt,name=password"` - Host string `json:"host" protobuf:"bytes,4,opt,name=host"` - Port int32 `json:"port" protobuf:"bytes,5,opt,name=port"` - Path string `json:"path" protobuf:"bytes,6,opt,name=path"` - Query string `json:"query" protobuf:"bytes,7,opt,name=query"` - Fragment string `json:"fragment" protobuf:"bytes,8,opt,name=fragment"` + Event *apicommon.Event `json:"event,omitempty" protobuf:"bytes,9,opt,name=event"` } // ArtifactLocation describes the source location for an external artifact type ArtifactLocation struct { - S3 *S3Artifact `json:"s3,omitempty" protobuf:"bytes,1,opt,name=s3"` - Inline *string `json:"inline,omitempty" protobuf:"bytes,2,opt,name=inline"` - File *FileArtifact `json:"file,omitempty" protobuf:"bytes,3,opt,name=file"` - URL *URLArtifact `json:"url,omitempty" protobuf:"bytes,4,opt,name=url"` - Configmap *ConfigmapArtifact `json:"configmap,omitempty" protobuf:"bytes,5,opt,name=configmap"` -} - -// S3Artifact contains information about an artifact in S3 -type S3Artifact struct { - S3Bucket *S3Bucket `json:",inline" protobuf:"bytes,4,opt,name=s3Bucket"` - Key string `json:"key,omitempty" protobuf:"bytes,1,opt,name=key"` - Event minio.NotificationEventType `json:"event,omitempty" protobuf:"bytes,2,opt,name=event"` - Filter *S3Filter `json:"filter,omitempty" protobuf:"bytes,3,opt,name=filter"` -} - -// S3Bucket contains information for an S3 Bucket -type S3Bucket struct { - Endpoint string `json:"endpoint,omitempty" protobuf:"bytes,1,opt,name=endpoint"` - Bucket string `json:"bucket,omitempty" protobuf:"bytes,2,opt,name=bucket"` - Region string `json:"region,omitempty" protobuf:"bytes,3,opt,name=region"` - Insecure bool `json:"insecure,omitempty" protobuf:"varint,4,opt,name=insecure"` - AccessKey *corev1.SecretKeySelector `json:"accessKey,omitempty" protobuf:"bytes,5,opt,name=accessKey"` - SecretKey *corev1.SecretKeySelector `json:"secretKey,omitempty" protobuf:"bytes,6,opt,name=secretKey"` -} - -// S3Filter represents filters to apply to bucket nofifications for specifying constraints on objects -type S3Filter struct { - Prefix string `json:"prefix" protobuf:"bytes,1,opt,name=prefix"` - Suffix string `json:"suffix" protobuf:"bytes,2,opt,name=suffix"` + S3 *apicommon.S3Artifact `json:"s3,omitempty" protobuf:"bytes,1,opt,name=s3"` + Inline *string `json:"inline,omitempty" protobuf:"bytes,2,opt,name=inline"` + File *FileArtifact `json:"file,omitempty" protobuf:"bytes,3,opt,name=file"` + URL *URLArtifact `json:"url,omitempty" protobuf:"bytes,4,opt,name=url"` + Configmap *ConfigmapArtifact `json:"configmap,omitempty" protobuf:"bytes,5,opt,name=configmap"` } // ConfigmapArtifact contains information about artifact in k8 configmap diff --git a/pkg/apis/sensor/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/sensor/v1alpha1/zz_generated.deepcopy.go index dcf0118891..6a5af5dbf1 100644 --- a/pkg/apis/sensor/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/sensor/v1alpha1/zz_generated.deepcopy.go @@ -20,6 +20,7 @@ limitations under the License. package v1alpha1 import ( + common "github.com/argoproj/argo-events/pkg/apis/common" v1 "k8s.io/api/core/v1" runtime "k8s.io/apimachinery/pkg/runtime" ) @@ -29,7 +30,7 @@ func (in *ArtifactLocation) DeepCopyInto(out *ArtifactLocation) { *out = *in if in.S3 != nil { in, out := &in.S3, &out.S3 - *out = new(S3Artifact) + *out = new(common.S3Artifact) (*in).DeepCopyInto(*out) } if in.Inline != nil { @@ -124,62 +125,6 @@ func (in *DataFilter) DeepCopy() *DataFilter { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *Event) DeepCopyInto(out *Event) { - *out = *in - in.Context.DeepCopyInto(&out.Context) - if in.Payload != nil { - in, out := &in.Payload, &out.Payload - *out = make([]byte, len(*in)) - copy(*out, *in) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Event. -func (in *Event) DeepCopy() *Event { - if in == nil { - return nil - } - out := new(Event) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *EventContext) DeepCopyInto(out *EventContext) { - *out = *in - if in.Source != nil { - in, out := &in.Source, &out.Source - *out = new(URI) - **out = **in - } - in.EventTime.DeepCopyInto(&out.EventTime) - if in.SchemaURL != nil { - in, out := &in.SchemaURL, &out.SchemaURL - *out = new(URI) - **out = **in - } - if in.Extensions != nil { - in, out := &in.Extensions, &out.Extensions - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EventContext. -func (in *EventContext) DeepCopy() *EventContext { - if in == nil { - return nil - } - out := new(EventContext) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *EventDependency) DeepCopyInto(out *EventDependency) { *out = *in @@ -207,7 +152,7 @@ func (in *EventDependencyFilter) DeepCopyInto(out *EventDependencyFilter) { } if in.Context != nil { in, out := &in.Context, &out.Context - *out = new(EventContext) + *out = new(common.EventContext) (*in).DeepCopyInto(*out) } if in.Data != nil { @@ -317,7 +262,7 @@ func (in *NodeStatus) DeepCopyInto(out *NodeStatus) { in.CompletedAt.DeepCopyInto(&out.CompletedAt) if in.Event != nil { in, out := &in.Event, &out.Event - *out = new(Event) + *out = new(common.Event) (*in).DeepCopyInto(*out) } return @@ -423,74 +368,6 @@ func (in *RetryStrategy) DeepCopy() *RetryStrategy { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *S3Artifact) DeepCopyInto(out *S3Artifact) { - *out = *in - if in.S3Bucket != nil { - in, out := &in.S3Bucket, &out.S3Bucket - *out = new(S3Bucket) - (*in).DeepCopyInto(*out) - } - if in.Filter != nil { - in, out := &in.Filter, &out.Filter - *out = new(S3Filter) - **out = **in - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new S3Artifact. -func (in *S3Artifact) DeepCopy() *S3Artifact { - if in == nil { - return nil - } - out := new(S3Artifact) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *S3Bucket) DeepCopyInto(out *S3Bucket) { - *out = *in - if in.AccessKey != nil { - in, out := &in.AccessKey, &out.AccessKey - *out = new(v1.SecretKeySelector) - (*in).DeepCopyInto(*out) - } - if in.SecretKey != nil { - in, out := &in.SecretKey, &out.SecretKey - *out = new(v1.SecretKeySelector) - (*in).DeepCopyInto(*out) - } - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new S3Bucket. -func (in *S3Bucket) DeepCopy() *S3Bucket { - if in == nil { - return nil - } - out := new(S3Bucket) - in.DeepCopyInto(out) - return out -} - -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *S3Filter) DeepCopyInto(out *S3Filter) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new S3Filter. -func (in *S3Filter) DeepCopy() *S3Filter { - if in == nil { - return nil - } - out := new(S3Filter) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Sensor) DeepCopyInto(out *Sensor) { *out = *in @@ -659,22 +536,6 @@ func (in *Trigger) DeepCopy() *Trigger { return out } -// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. -func (in *URI) DeepCopyInto(out *URI) { - *out = *in - return -} - -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new URI. -func (in *URI) DeepCopy() *URI { - if in == nil { - return nil - } - out := new(URI) - in.DeepCopyInto(out) - return out -} - // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *URLArtifact) DeepCopyInto(out *URLArtifact) { *out = *in diff --git a/pkg/common/common.go b/pkg/common/common.go deleted file mode 100644 index 6b23d79551..0000000000 --- a/pkg/common/common.go +++ /dev/null @@ -1,35 +0,0 @@ -/* -Copyright 2018 BlackRock, Inc. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package common - -// EventProtocolType is type of the event dispatch protocol. Used for dispatching events -type EventProtocolType string - -// possible types of event dispatch protocol -const ( - HTTP EventProtocolType = "HTTP" - NATS EventProtocolType = "NATS" -) - -// Type of nats connection. -type NatsType string - -// possible values of nats connection type -const ( - Standard NatsType = "Standard" - Streaming NatsType = "Streaming" -) diff --git a/sensors/config.go b/sensors/config.go index 3499d695e4..6ef399dd6f 100644 --- a/sensors/config.go +++ b/sensors/config.go @@ -1,12 +1,13 @@ package sensors import ( - "github.com/nats-io/go-nats" "net/http" + "github.com/nats-io/go-nats" + "github.com/argoproj/argo-events/common" + apicommon "github.com/argoproj/argo-events/pkg/apis/common" "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" - ss_v1alpha1 "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" clientset "github.com/argoproj/argo-events/pkg/client/sensor/clientset/versioned" snats "github.com/nats-io/go-nats-streaming" "github.com/rs/zerolog" @@ -50,7 +51,7 @@ type natsconn struct { // updateNotification is servers as a notification message that can be used to update event dependency's state or the sensor resource type updateNotification struct { - event *ss_v1alpha1.Event + event *apicommon.Event eventDependency *v1alpha1.EventDependency writer http.ResponseWriter sensor *v1alpha1.Sensor diff --git a/sensors/event-handler.go b/sensors/event-handler.go index 9cf59fa8cc..5e903c2b2b 100644 --- a/sensors/event-handler.go +++ b/sensors/event-handler.go @@ -24,10 +24,11 @@ import ( "github.com/argoproj/argo-events/common" sn "github.com/argoproj/argo-events/controllers/sensor" + apicommon "github.com/argoproj/argo-events/pkg/apis/common" + pc "github.com/argoproj/argo-events/pkg/apis/common" "github.com/argoproj/argo-events/pkg/apis/sensor" "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" ss_v1alpha1 "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" - pc "github.com/argoproj/argo-events/pkg/common" ) // processUpdateNotification processes event received by sensor, validates it, updates the state of the node representing the event dependency @@ -166,7 +167,7 @@ func (sec *sensorExecutionCtx) WatchEventsFromGateways() { } // validateEvent validates whether the event is indeed from gateway that this sensor is watching -func (sec *sensorExecutionCtx) validateEvent(events *ss_v1alpha1.Event) (*ss_v1alpha1.EventDependency, bool) { +func (sec *sensorExecutionCtx) validateEvent(events *apicommon.Event) (*ss_v1alpha1.EventDependency, bool) { for _, event := range sec.sensor.Spec.Dependencies { if event.Name == events.Context.Source.Host { return &event, true @@ -175,8 +176,8 @@ func (sec *sensorExecutionCtx) validateEvent(events *ss_v1alpha1.Event) (*ss_v1a return nil, false } -func (sec *sensorExecutionCtx) parseEvent(payload []byte) (*v1alpha1.Event, error) { - var event *ss_v1alpha1.Event +func (sec *sensorExecutionCtx) parseEvent(payload []byte) (*apicommon.Event, error) { + var event *apicommon.Event if err := json.Unmarshal(payload, &event); err != nil { response := "failed to parse event received from gateway" sec.log.Error().Err(err).Msg(response) @@ -185,7 +186,7 @@ func (sec *sensorExecutionCtx) parseEvent(payload []byte) (*v1alpha1.Event, erro return event, nil } -func (sec *sensorExecutionCtx) sendEventToInternalQueue(event *v1alpha1.Event, writer http.ResponseWriter) bool { +func (sec *sensorExecutionCtx) sendEventToInternalQueue(event *apicommon.Event, writer http.ResponseWriter) bool { // validate whether the event is from gateway that this sensor is watching if eventDependency, isValidEvent := sec.validateEvent(event); isValidEvent { // process the event diff --git a/sensors/event-handler_test.go b/sensors/event-handler_test.go index 38f875dbdb..0720c2edf0 100644 --- a/sensors/event-handler_test.go +++ b/sensors/event-handler_test.go @@ -18,19 +18,20 @@ package sensors import ( "fmt" + "net/http" + "testing" + "time" + "github.com/argoproj/argo-events/common" sensor2 "github.com/argoproj/argo-events/controllers/sensor" + apicommon "github.com/argoproj/argo-events/pkg/apis/common" "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" + sensorFake "github.com/argoproj/argo-events/pkg/client/sensor/clientset/versioned/fake" "github.com/ghodss/yaml" "github.com/smartystreets/goconvey/convey" - "k8s.io/client-go/kubernetes/fake" - "net/http" - "testing" - - sensorFake "github.com/argoproj/argo-events/pkg/client/sensor/clientset/versioned/fake" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" discoveryFake "k8s.io/client-go/discovery/fake" - "time" + "k8s.io/client-go/kubernetes/fake" ) var sensorStr = `apiVersion: argoproj.io/v1alpha1 @@ -106,16 +107,16 @@ func getsensorExecutionCtx(sensor *v1alpha1.Sensor) *sensorExecutionCtx { } } -func getCloudEvent() *v1alpha1.Event { - return &v1alpha1.Event{ - Context: v1alpha1.EventContext{ +func getCloudEvent() *apicommon.Event { + return &apicommon.Event{ + Context: apicommon.EventContext{ CloudEventsVersion: common.CloudEventsVersion, EventID: fmt.Sprintf("%x", "123"), ContentType: "application/json", EventTime: metav1.MicroTime{Time: time.Now().UTC()}, EventType: "test", EventTypeVersion: common.CloudEventsVersion, - Source: &v1alpha1.URI{ + Source: &apicommon.URI{ Host: common.DefaultGatewayConfigurationName("test-gateway", "test"), }, }, diff --git a/sensors/nats-events-handler.go b/sensors/nats-events-handler.go index ef450607ac..dfc8a04a2a 100644 --- a/sensors/nats-events-handler.go +++ b/sensors/nats-events-handler.go @@ -23,7 +23,7 @@ import ( "time" "github.com/argoproj/argo-events/common" - pc "github.com/argoproj/argo-events/pkg/common" + pc "github.com/argoproj/argo-events/pkg/apis/common" "github.com/nats-io/go-nats" snats "github.com/nats-io/go-nats-streaming" ) @@ -152,57 +152,50 @@ func (sec *sensorExecutionCtx) getNatsStandardSubscription(eventSource string) ( // getNatsStreamingSubscription returns a streaming nats subscription func (sec *sensorExecutionCtx) getNatsStreamingSubscription(eventSource string) (snats.Subscription, error) { - if sec.sensor.Spec.EventProtocol.Nats.StartWithLastReceived { - return sec.nconn.stream.QueueSubscribe(eventSource, common.DefaultNatsQueueName(eventSource), func(msg *snats.Msg) { - sec.processNatsMessage(msg.Data, eventSource) - }, snats.StartWithLastReceived()) + subscriptionOption, err := sec.getNatsStreamingOption(eventSource) + if err != nil { + return nil, err } + return sec.nconn.stream.QueueSubscribe(eventSource, common.DefaultNatsQueueName(eventSource), func(msg *snats.Msg) { + sec.processNatsMessage(msg.Data, eventSource) + }, subscriptionOption) +} +// getNatsStreamingOption returns a streaming option +func (sec *sensorExecutionCtx) getNatsStreamingOption(eventSource string) (snats.SubscriptionOption, error) { + if sec.sensor.Spec.EventProtocol.Nats.StartWithLastReceived { + snats.StartWithLastReceived() + } if sec.sensor.Spec.EventProtocol.Nats.DeliverAllAvailable { - return sec.nconn.stream.QueueSubscribe(eventSource, common.DefaultNatsQueueName(eventSource), func(msg *snats.Msg) { - sec.processNatsMessage(msg.Data, eventSource) - }, snats.DeliverAllAvailable()) + snats.DeliverAllAvailable() } - if sec.sensor.Spec.EventProtocol.Nats.Durable { - return sec.nconn.stream.QueueSubscribe(eventSource, common.DefaultNatsQueueName(eventSource), func(msg *snats.Msg) { - sec.processNatsMessage(msg.Data, eventSource) - }, snats.DurableName(eventSource)) + snats.DurableName(eventSource) } - if sec.sensor.Spec.EventProtocol.Nats.StartAtSequence != "" { sequence, err := strconv.Atoi(sec.sensor.Spec.EventProtocol.Nats.StartAtSequence) if err != nil { return nil, err } - return sec.nconn.stream.QueueSubscribe(eventSource, common.DefaultNatsQueueName(eventSource), func(msg *snats.Msg) { - sec.processNatsMessage(msg.Data, eventSource) - }, snats.StartAtSequence(uint64(sequence))) + return snats.StartAtSequence(uint64(sequence)), nil } - if sec.sensor.Spec.EventProtocol.Nats.StartAtTime != "" { startTime, err := time.Parse(common.StandardTimeFormat, sec.sensor.Spec.EventProtocol.Nats.StartAtTime) if err != nil { return nil, err } - return sec.nconn.stream.QueueSubscribe(eventSource, common.DefaultNatsQueueName(eventSource), func(msg *snats.Msg) { - sec.processNatsMessage(msg.Data, eventSource) - }, snats.StartAtTime(startTime)) + return snats.StartAtTime(startTime), nil } - if sec.sensor.Spec.EventProtocol.Nats.StartAtTimeDelta != "" { duration, err := time.ParseDuration(sec.sensor.Spec.EventProtocol.Nats.StartAtTimeDelta) if err != nil { return nil, err } - return sec.nconn.stream.QueueSubscribe(eventSource, common.DefaultNatsQueueName(eventSource), func(msg *snats.Msg) { - sec.processNatsMessage(msg.Data, eventSource) - }, snats.StartAtTimeDelta(duration)) + return snats.StartAtTimeDelta(duration), nil } - - return sec.nconn.stream.QueueSubscribe(eventSource, common.DefaultNatsQueueName(eventSource), func(msg *snats.Msg) { - sec.processNatsMessage(msg.Data, eventSource) - }) + return func(o *snats.SubscriptionOptions) error { + return nil + }, nil } // processNatsMessage handles a nats message payload diff --git a/sensors/signal-filter.go b/sensors/signal-filter.go index 04a270e094..4c64110778 100644 --- a/sensors/signal-filter.go +++ b/sensors/signal-filter.go @@ -28,8 +28,8 @@ import ( "time" "github.com/argoproj/argo-events/common" + apicommon "github.com/argoproj/argo-events/pkg/apis/common" "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" - v1alpha "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" "github.com/tidwall/gjson" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -43,7 +43,7 @@ const ( ) // apply the eventDependency filters to an event -func (sec *sensorExecutionCtx) filterEvent(f v1alpha1.EventDependencyFilter, event *v1alpha.Event) (bool, error) { +func (sec *sensorExecutionCtx) filterEvent(f v1alpha1.EventDependencyFilter, event *apicommon.Event) (bool, error) { dataRes, err := sec.filterData(f.Data, event) if err != nil { return false, err @@ -114,7 +114,7 @@ func (sec *sensorExecutionCtx) filterTime(timeFilter *v1alpha1.TimeFilter, event // applyContextFilter checks the expected EventContext against the actual EventContext // values are only enforced if they are non-zero values // map types check that the expected map is a subset of the actual map -func (sec *sensorExecutionCtx) filterContext(expected *v1alpha.EventContext, actual *v1alpha.EventContext) bool { +func (sec *sensorExecutionCtx) filterContext(expected *apicommon.EventContext, actual *apicommon.EventContext) bool { if expected == nil { return true } @@ -147,7 +147,7 @@ func (sec *sensorExecutionCtx) filterContext(expected *v1alpha.EventContext, act // applyDataFilter runs the dataFilter against the event's data // returns (true, nil) when data passes filters, false otherwise // TODO: split this function up into smaller pieces -func (sec *sensorExecutionCtx) filterData(data *v1alpha1.Data, event *v1alpha.Event) (bool, error) { +func (sec *sensorExecutionCtx) filterData(data *v1alpha1.Data, event *apicommon.Event) (bool, error) { // TODO: use the event.Context.SchemaURL to figure out correct data format to unmarshal to // for now, let's just use a simple map[string]interface{} for arbitrary data if data == nil { @@ -221,7 +221,7 @@ func isJSON(b []byte) bool { // util method to render an event's data as a JSON []byte // json is a subset of yaml so this should work... -func renderEventDataAsJSON(e *v1alpha.Event) ([]byte, error) { +func renderEventDataAsJSON(e *apicommon.Event) ([]byte, error) { if e == nil { return nil, fmt.Errorf("event is nil") } diff --git a/sensors/signal-filter_test.go b/sensors/signal-filter_test.go index b72bb86598..8414fbf727 100644 --- a/sensors/signal-filter_test.go +++ b/sensors/signal-filter_test.go @@ -21,6 +21,7 @@ import ( "time" "github.com/argoproj/argo-events/common" + apicommon "github.com/argoproj/argo-events/pkg/apis/common" "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" "github.com/stretchr/testify/assert" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -88,7 +89,7 @@ func Test_filterContext(t *testing.T) { func Test_filterData(t *testing.T) { type args struct { data *v1alpha1.Data - event *v1alpha1.Event + event *apicommon.Event } tests := []struct { name string @@ -104,14 +105,14 @@ func Test_filterData(t *testing.T) { }, { name: "unsupported content type", - args: args{data: nil, event: &v1alpha1.Event{Payload: []byte("a")}}, + args: args{data: nil, event: &apicommon.Event{Payload: []byte("a")}}, want: true, wantErr: false, }, { name: "empty data", - args: args{data: nil, event: &v1alpha1.Event{ - Context: v1alpha1.EventContext{ + args: args{data: nil, event: &apicommon.Event{ + Context: apicommon.EventContext{ ContentType: "application/json", }, }}, @@ -120,8 +121,8 @@ func Test_filterData(t *testing.T) { }, { name: "nil filters, JSON data", - args: args{data: nil, event: &v1alpha1.Event{ - Context: v1alpha1.EventContext{ + args: args{data: nil, event: &apicommon.Event{ + Context: apicommon.EventContext{ ContentType: "application/json", }, Payload: []byte("{\"k\": \"v\"}"), @@ -141,8 +142,8 @@ func Test_filterData(t *testing.T) { }, }, }, - event: &v1alpha1.Event{ - Context: v1alpha1.EventContext{ + event: &apicommon.Event{ + Context: apicommon.EventContext{ ContentType: "application/json", }, Payload: []byte("{\"k\": \"v\"}"), @@ -161,8 +162,8 @@ func Test_filterData(t *testing.T) { }, }, }, - event: &v1alpha1.Event{ - Context: v1alpha1.EventContext{ + event: &apicommon.Event{ + Context: apicommon.EventContext{ ContentType: "application/json", }, Payload: []byte("{\"k\": \"1.0\"}"), @@ -192,8 +193,8 @@ func Test_filterData(t *testing.T) { }, }, }, - event: &v1alpha1.Event{ - Context: v1alpha1.EventContext{ + event: &apicommon.Event{ + Context: apicommon.EventContext{ ContentType: "application/json", }, Payload: []byte("{\"k\": true, \"k1\": {\"k\": 3.14, \"k2\": \"hello, world\"}}"), @@ -267,7 +268,7 @@ func Test_mapIsSubset(t *testing.T) { // this test is meant to cover the missing cases for those not covered in eventDependency-filter_test.go and trigger-params_test.go func Test_renderEventDataAsJSON(t *testing.T) { type args struct { - e *v1alpha1.Event + e *apicommon.Event } tests := []struct { name string @@ -283,14 +284,14 @@ func Test_renderEventDataAsJSON(t *testing.T) { }, { name: "missing content type", - args: args{e: &v1alpha1.Event{}}, + args: args{e: &apicommon.Event{}}, want: nil, wantErr: true, }, { name: "valid yaml content", - args: args{e: &v1alpha1.Event{ - Context: v1alpha1.EventContext{ + args: args{e: &apicommon.Event{ + Context: apicommon.EventContext{ ContentType: MediaTypeYAML, }, Payload: []byte(`apiVersion: v1alpha1`), @@ -300,8 +301,8 @@ func Test_renderEventDataAsJSON(t *testing.T) { }, { name: "json content marked as yaml", - args: args{e: &v1alpha1.Event{ - Context: v1alpha1.EventContext{ + args: args{e: &apicommon.Event{ + Context: apicommon.EventContext{ ContentType: MediaTypeYAML, }, Payload: []byte(`{"apiVersion":5}`), @@ -311,8 +312,8 @@ func Test_renderEventDataAsJSON(t *testing.T) { }, { name: "invalid json content", - args: args{e: &v1alpha1.Event{ - Context: v1alpha1.EventContext{ + args: args{e: &apicommon.Event{ + Context: apicommon.EventContext{ ContentType: MediaTypeJSON, }, Payload: []byte(`{5:"numberkey"}`), @@ -322,8 +323,8 @@ func Test_renderEventDataAsJSON(t *testing.T) { }, { name: "invalid yaml content", - args: args{e: &v1alpha1.Event{ - Context: v1alpha1.EventContext{ + args: args{e: &apicommon.Event{ + Context: apicommon.EventContext{ ContentType: MediaTypeYAML, }, Payload: []byte(`%\x786`), diff --git a/sensors/trigger-params.go b/sensors/trigger-params.go index 0bb3afa168..d2c628b139 100644 --- a/sensors/trigger-params.go +++ b/sensors/trigger-params.go @@ -19,14 +19,14 @@ package sensors import ( "fmt" + apicommon "github.com/argoproj/argo-events/pkg/apis/common" "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" - v1alpha "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" "github.com/tidwall/gjson" "github.com/tidwall/sjson" ) // apply the params to the resource json object -func applyParams(jsonObj []byte, params []v1alpha1.ResourceParameter, events map[string]v1alpha.Event) ([]byte, error) { +func applyParams(jsonObj []byte, params []v1alpha1.ResourceParameter, events map[string]apicommon.Event) ([]byte, error) { for _, param := range params { // let's grab the param value v, err := resolveParamValue(param.Src, events) @@ -45,7 +45,7 @@ func applyParams(jsonObj []byte, params []v1alpha1.ResourceParameter, events map // helper method to resolve the parameter's value from the src // returns an error if the Path is invalid/not found and the default value is nil OR if the eventDependency event doesn't exist and default value is nil -func resolveParamValue(src *v1alpha1.ResourceParameterSource, events map[string]v1alpha.Event) (string, error) { +func resolveParamValue(src *v1alpha1.ResourceParameterSource, events map[string]apicommon.Event) (string, error) { if e, ok := events[src.Event]; ok { // only convert payload to json when path is set. if src.Path == "" { diff --git a/sensors/trigger-params_test.go b/sensors/trigger-params_test.go index 8db0cd0c71..0590f5c618 100644 --- a/sensors/trigger-params_test.go +++ b/sensors/trigger-params_test.go @@ -22,21 +22,21 @@ import ( "fmt" + apicommon "github.com/argoproj/argo-events/pkg/apis/common" "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" - v1alpha "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" ) func Test_applyParams(t *testing.T) { defaultValue := "default" - events := map[string]v1alpha.Event{ + events := map[string]apicommon.Event{ "simpleJSON": { - Context: v1alpha.EventContext{ + Context: apicommon.EventContext{ ContentType: MediaTypeJSON, }, Payload: []byte(`{"name":{"first":"matt","last":"magaldi"},"age":24}`), }, "nonJSON": { - Context: v1alpha.EventContext{ + Context: apicommon.EventContext{ ContentType: MediaTypeJSON, }, Payload: []byte(`apiVersion: v1alpha1`), @@ -45,7 +45,7 @@ func Test_applyParams(t *testing.T) { type args struct { jsonObj []byte params []v1alpha1.ResourceParameter - events map[string]v1alpha.Event + events map[string]apicommon.Event } tests := []struct { name string diff --git a/sensors/trigger.go b/sensors/trigger.go index 315e02a8df..286f238cc9 100644 --- a/sensors/trigger.go +++ b/sensors/trigger.go @@ -21,9 +21,9 @@ import ( "github.com/argoproj/argo-events/common" sn "github.com/argoproj/argo-events/controllers/sensor" + apicommon "github.com/argoproj/argo-events/pkg/apis/common" "github.com/argoproj/argo-events/pkg/apis/sensor" "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" - v1alpha "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" "github.com/argoproj/argo-events/store" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -176,8 +176,8 @@ func (sec *sensorExecutionCtx) createResourceObject(resource *v1alpha1.ResourceO // helper method to extract the events from the event dependencies nodes associated with the resource params // returns a map of the events keyed by the event dependency name -func (sec *sensorExecutionCtx) extractEvents(params []v1alpha1.ResourceParameter) map[string]v1alpha.Event { - events := make(map[string]v1alpha.Event) +func (sec *sensorExecutionCtx) extractEvents(params []v1alpha1.ResourceParameter) map[string]apicommon.Event { + events := make(map[string]apicommon.Event) for _, param := range params { if param.Src != nil { node := sn.GetNodeByName(sec.sensor, param.Src.Event) diff --git a/store/creds.go b/store/creds.go index 10449b6695..2dad727153 100644 --- a/store/creds.go +++ b/store/creds.go @@ -36,11 +36,11 @@ type Credentials struct { // GetCredentials for this artifact func GetCredentials(kubeClient kubernetes.Interface, namespace string, art *v1alpha1.ArtifactLocation) (*Credentials, error) { if art.S3 != nil { - accessKey, err := GetSecrets(kubeClient, namespace, art.S3.S3Bucket.AccessKey.Name, art.S3.S3Bucket.AccessKey.Key) + accessKey, err := GetSecrets(kubeClient, namespace, art.S3.AccessKey.Name, art.S3.AccessKey.Key) if err != nil { return nil, err } - secretKey, err := GetSecrets(kubeClient, namespace, art.S3.S3Bucket.SecretKey.Name, art.S3.S3Bucket.SecretKey.Key) + secretKey, err := GetSecrets(kubeClient, namespace, art.S3.SecretKey.Name, art.S3.SecretKey.Key) if err != nil { return nil, err } diff --git a/store/creds_test.go b/store/creds_test.go index 713cbdcf6c..160b5f7e48 100644 --- a/store/creds_test.go +++ b/store/creds_test.go @@ -24,6 +24,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes/fake" + apicommon "github.com/argoproj/argo-events/pkg/apis/common" "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" ) @@ -48,16 +49,17 @@ func TestGetCredentials(t *testing.T) { // succeed for S3 artifact type s3Artifact := &v1alpha1.ArtifactLocation{ - S3: &v1alpha1.S3Artifact{ - S3Bucket: &v1alpha1.S3Bucket{ - AccessKey: &apiv1.SecretKeySelector{ - LocalObjectReference: apiv1.LocalObjectReference{Name: "test"}, - Key: "access", - }, - SecretKey: &apiv1.SecretKeySelector{ - LocalObjectReference: apiv1.LocalObjectReference{Name: "test"}, - Key: "secret", - }, + S3: &apicommon.S3Artifact{ + AccessKey: &apiv1.SecretKeySelector{ + LocalObjectReference: apiv1.LocalObjectReference{Name: "test"}, + Key: "access", + }, + SecretKey: &apiv1.SecretKeySelector{ + LocalObjectReference: apiv1.LocalObjectReference{Name: "test"}, + Key: "secret", + }, + Bucket: &apicommon.S3Bucket{ + Name: "test-bucket", }, }, } diff --git a/store/file.go b/store/file.go index 55f951f214..11c9c2c0ba 100644 --- a/store/file.go +++ b/store/file.go @@ -1,3 +1,19 @@ +/* +Copyright 2018 BlackRock, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package store import ( diff --git a/store/file_test.go b/store/file_test.go index f87fce947b..9b264e69be 100644 --- a/store/file_test.go +++ b/store/file_test.go @@ -1,3 +1,19 @@ +/* +Copyright 2018 BlackRock, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package store import ( diff --git a/store/inline.go b/store/inline.go index 1067d3e2c6..01f6f68ed5 100644 --- a/store/inline.go +++ b/store/inline.go @@ -1,3 +1,19 @@ +/* +Copyright 2018 BlackRock, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package store import ( diff --git a/store/inline_test.go b/store/inline_test.go index 26ef198965..bf33ac532f 100644 --- a/store/inline_test.go +++ b/store/inline_test.go @@ -1,3 +1,19 @@ +/* +Copyright 2018 BlackRock, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + package store import ( diff --git a/store/s3.go b/store/s3.go index 1c3c1250dd..53bcfe245d 100644 --- a/store/s3.go +++ b/store/s3.go @@ -20,7 +20,7 @@ import ( "fmt" "io/ioutil" - "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1" + apicommon "github.com/argoproj/argo-events/pkg/apis/common" "github.com/minio/minio-go" log "github.com/sirupsen/logrus" ) @@ -28,12 +28,12 @@ import ( // S3Reader implements the ArtifactReader interface and allows reading artifacts from S3 compatible API store type S3Reader struct { client *minio.Client - s3 *v1alpha1.S3Artifact + s3 *apicommon.S3Artifact creds *Credentials } // NewS3Reader creates a new ArtifactReader for an S3 compatible store -func NewS3Reader(s3 *v1alpha1.S3Artifact, creds *Credentials) (ArtifactReader, error) { +func NewS3Reader(s3 *apicommon.S3Artifact, creds *Credentials) (ArtifactReader, error) { client, err := NewMinioClient(s3, *creds) if err != nil { return nil, err @@ -46,8 +46,8 @@ func NewS3Reader(s3 *v1alpha1.S3Artifact, creds *Credentials) (ArtifactReader, e } func (reader *S3Reader) Read() ([]byte, error) { - log.Debugf("reading s3Artifact from %s/%s", reader.s3.S3Bucket.Bucket, reader.s3.Key) - obj, err := reader.client.GetObject(reader.s3.S3Bucket.Bucket, reader.s3.Key, minio.GetObjectOptions{}) + log.Debugf("reading s3Artifact from %s/%s", reader.s3.Bucket.Name, reader.s3.Bucket.Key) + obj, err := reader.client.GetObject(reader.s3.Bucket.Name, reader.s3.Bucket.Key, minio.GetObjectOptions{}) if err != nil { return nil, err } @@ -65,13 +65,13 @@ func (reader *S3Reader) Read() ([]byte, error) { } // NewMinioClient instantiates a new minio client object to access s3 compatible APIs -func NewMinioClient(s3 *v1alpha1.S3Artifact, creds Credentials) (*minio.Client, error) { +func NewMinioClient(s3 *apicommon.S3Artifact, creds Credentials) (*minio.Client, error) { var minioClient *minio.Client var err error - if s3.S3Bucket.Region != "" { - minioClient, err = minio.NewWithRegion(s3.S3Bucket.Endpoint, creds.accessKey, creds.secretKey, !s3.S3Bucket.Insecure, s3.S3Bucket.Region) + if s3.Region != "" { + minioClient, err = minio.NewWithRegion(s3.Endpoint, creds.accessKey, creds.secretKey, !s3.Insecure, s3.Region) } else { - minioClient, err = minio.New(s3.S3Bucket.Endpoint, creds.accessKey, creds.secretKey, !s3.S3Bucket.Insecure) + minioClient, err = minio.New(s3.Endpoint, creds.accessKey, creds.secretKey, !s3.Insecure) } if err != nil { return nil, err From b5f28ce798d59a13398dd0099de4a6834522af69 Mon Sep 17 00:00:00 2001 From: vpage Date: Wed, 23 Jan 2019 19:56:20 -0500 Subject: [PATCH 14/22] Adding deepcopy and proto files for common api --- gateways/core/artifact/start.go | 4 ++-- gateways/core/webhook/start.go | 2 ++ gateways/custom/github/start.go | 2 ++ gateways/custom/gitlab/start.go | 2 ++ gateways/custom/storagegrid/start.go | 2 ++ hack/generate-proto.sh | 1 + hack/k8s/manifests/gateway-controller-deployment.yaml | 2 +- hack/k8s/manifests/sensor-controller-deployment.yaml | 2 +- 8 files changed, 13 insertions(+), 4 deletions(-) diff --git a/gateways/core/artifact/start.go b/gateways/core/artifact/start.go index 8721d0ecec..f3c7f2783a 100644 --- a/gateways/core/artifact/start.go +++ b/gateways/core/artifact/start.go @@ -46,9 +46,9 @@ func (ese *S3EventSourceExecutor) StartEventSource(eventSource *gateways.EventSo func (ese *S3EventSourceExecutor) listenEvents(a *apicommon.S3Artifact, eventSource *gateways.EventSource, dataCh chan []byte, errorCh chan error, doneCh chan struct{}) { defer gateways.Recover(eventSource.Name) - ese.Log.Info().Str("event-source-name", eventSource.Name).Msg("retrieving access and secret key") + ese.Log.Info().Str("event-source-name", eventSource.Name).Interface("event-source", eventSource).Msg("retrieving access and secret key") // retrieve access key id and secret access key - accessKey, err := store.GetSecrets(ese.Clientset, ese.Namespace, a.AccessKey.Name, a.SecretKey.Key) + accessKey, err := store.GetSecrets(ese.Clientset, ese.Namespace, a.AccessKey.Name, a.AccessKey.Key) if err != nil { errorCh <- err return diff --git a/gateways/core/webhook/start.go b/gateways/core/webhook/start.go index c8cd03822d..a97a369af7 100644 --- a/gateways/core/webhook/start.go +++ b/gateways/core/webhook/start.go @@ -152,6 +152,8 @@ func (rc *routeConfig) routeActiveHandler(writer http.ResponseWriter, request *h // StartEventSource starts a event source func (ese *WebhookEventSourceExecutor) StartEventSource(eventSource *gateways.EventSource, eventStream gateways.Eventing_StartEventSourceServer) error { + defer gateways.Recover(eventSource.Name) + ese.Log.Info().Str("event-source-name", eventSource.Name).Msg("operating on event source") h, err := parseEventSource(eventSource.Data) if err != nil { diff --git a/gateways/custom/github/start.go b/gateways/custom/github/start.go index d24bf34396..3aa0c0c9ca 100644 --- a/gateways/custom/github/start.go +++ b/gateways/custom/github/start.go @@ -53,6 +53,8 @@ func (ese *GithubEventSourceExecutor) getCredentials(gs *GithubSecret) (*cred, e // StartEventSource starts an event source func (ese *GithubEventSourceExecutor) StartEventSource(eventSource *gateways.EventSource, eventStream gateways.Eventing_StartEventSourceServer) error { + defer gateways.Recover(eventSource.Name) + ese.Log.Info().Str("event-source-name", eventSource.Name).Msg("operating on event source") g, err := parseEventSource(eventSource.Data) if err != nil { diff --git a/gateways/custom/gitlab/start.go b/gateways/custom/gitlab/start.go index ad43517b12..1b62095e2d 100644 --- a/gateways/custom/gitlab/start.go +++ b/gateways/custom/gitlab/start.go @@ -38,6 +38,8 @@ func (ese *GitlabEventSourceExecutor) getCredentials(gs *GitlabSecret) (*cred, e // StartEventSource starts an event source func (ese *GitlabEventSourceExecutor) StartEventSource(eventSource *gateways.EventSource, eventStream gateways.Eventing_StartEventSourceServer) error { + defer gateways.Recover(eventSource.Name) + ese.Log.Info().Str("event-source-name", eventSource.Name).Msg("operating on event source") g, err := parseEventSource(eventSource.Data) if err != nil { diff --git a/gateways/custom/storagegrid/start.go b/gateways/custom/storagegrid/start.go index bd2a5572e8..a8880775b7 100644 --- a/gateways/custom/storagegrid/start.go +++ b/gateways/custom/storagegrid/start.go @@ -177,6 +177,8 @@ func (rc *routeConfig) startHttpServer() { // StartConfig runs a configuration func (ese *StorageGridEventSourceExecutor) StartEventSource(eventSource *gateways.EventSource, eventStream gateways.Eventing_StartEventSourceServer) error { + defer gateways.Recover(eventSource.Name) + ese.Log.Info().Str("event-source-name", eventSource.Name).Msg("operating on event source") sg, err := parseEventSource(eventSource.Data) if err != nil { diff --git a/hack/generate-proto.sh b/hack/generate-proto.sh index 1362210ab4..e698ed01cd 100755 --- a/hack/generate-proto.sh +++ b/hack/generate-proto.sh @@ -23,6 +23,7 @@ go build -i -o dist/protoc-gen-gogo ./vendor/k8s.io/code-generator/cmd/go-to-pro # --apimachinery-packages= option so that go-to-protobuf can locate the types, but prefixed with a # '-' so that go-to-protobuf will not generate .proto files for it. PACKAGES=( + github.com/argoproj/argo-events/pkg/apis/common github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1 github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1 ) diff --git a/hack/k8s/manifests/gateway-controller-deployment.yaml b/hack/k8s/manifests/gateway-controller-deployment.yaml index c4fb17b7b8..a67e4c4ee3 100644 --- a/hack/k8s/manifests/gateway-controller-deployment.yaml +++ b/hack/k8s/manifests/gateway-controller-deployment.yaml @@ -13,7 +13,7 @@ spec: serviceAccountName: argo-events-sa containers: - name: gateway-controller - image: metalgearsolid/gateway-controller:v0.6.1 + image: argoproj/gateway-controller:v0.6 imagePullPolicy: Always env: - name: GATEWAY_NAMESPACE diff --git a/hack/k8s/manifests/sensor-controller-deployment.yaml b/hack/k8s/manifests/sensor-controller-deployment.yaml index b3e9293748..f851101b57 100644 --- a/hack/k8s/manifests/sensor-controller-deployment.yaml +++ b/hack/k8s/manifests/sensor-controller-deployment.yaml @@ -13,7 +13,7 @@ spec: serviceAccountName: argo-events-sa containers: - name: sensor-controller - image: metalgearsolid/sensor-controller:v0.6.1 + image: argoproj/sensor-controller:v0.6 imagePullPolicy: Always env: - name: SENSOR_NAMESPACE From c872bde7db011e303b282c4c858d105fd6a911eb Mon Sep 17 00:00:00 2001 From: vpage Date: Thu, 24 Jan 2019 16:55:22 -0500 Subject: [PATCH 15/22] making trigger errors more explicit --- sensors/trigger-params.go | 3 ++- sensors/trigger.go | 12 ++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/sensors/trigger-params.go b/sensors/trigger-params.go index d2c628b139..1cdbcf5e01 100644 --- a/sensors/trigger-params.go +++ b/sensors/trigger-params.go @@ -53,10 +53,11 @@ func resolveParamValue(src *v1alpha1.ResourceParameterSource, events map[string] } js, err := renderEventDataAsJSON(&e) if err != nil { + fmt.Printf("failed to render event data as json. err: %+v", err) if src.Value != nil { return *src.Value, nil } - return "", err + return "", fmt.Errorf("failed to render event payload as JSON. err:%+v", err) } res := gjson.GetBytes(js, src.Path) if res.Exists() { diff --git a/sensors/trigger.go b/sensors/trigger.go index 286f238cc9..25e785c70b 100644 --- a/sensors/trigger.go +++ b/sensors/trigger.go @@ -132,35 +132,35 @@ func (sec *sensorExecutionCtx) createResourceObject(resource *v1alpha1.ResourceO if len(resource.Parameters) > 0 { jObj, err := obj.MarshalJSON() if err != nil { - return err + return fmt.Errorf("failed to marshal json. err: %+v", err) } events := sec.extractEvents(resource.Parameters) jUpdatedObj, err := applyParams(jObj, resource.Parameters, events) if err != nil { - return err + return fmt.Errorf("failed to apply params. err: %+v", err) } err = obj.UnmarshalJSON(jUpdatedObj) if err != nil { - return err + return fmt.Errorf("failed to un-marshal json. err: %+v", err) } } gvk := obj.GroupVersionKind() client, err := sec.clientPool.ClientForGroupVersionKind(gvk) if err != nil { - return err + return fmt.Errorf("failed to get client for given group verison and kind. err: %+v", err) } apiResource, err := common.ServerResourceForGroupVersionKind(sec.discoveryClient, gvk) if err != nil { - return err + return fmt.Errorf("failed to get server resource for given group verison and kind. err: %+v", err) } sec.log.Info().Str("api", apiResource.Name).Str("group-version", gvk.Version).Msg("created api resource") reIf := client.Resource(apiResource, resource.Namespace) liveObj, err := reIf.Create(obj) if err != nil { - return err + return fmt.Errorf("failed to create resource object. err: %+v", err) } sec.log.Info().Str("kind", liveObj.GetKind()).Str("name", liveObj.GetName()).Msg("created object") if !errors.IsAlreadyExists(err) { From 10dd0eef5af8905e8c8921d79d217b6699c808da Mon Sep 17 00:00:00 2001 From: vpage Date: Sat, 26 Jan 2019 20:24:51 -0500 Subject: [PATCH 16/22] Updating docs for v0.7 --- CHANGELOG.md | 8 + CONTRIBUTING.md | 2 +- README.md | 18 +- docs/architecture.png | Bin 130074 -> 0 bytes docs/artifact-guide.md | 60 +- docs/controllers-guide.md | 73 +- docs/core-gateway-style.png | Bin 46683 -> 0 bytes docs/custom-gateway.md | 186 +-- docs/gateway-controller-fsm.png | Bin 66725 -> 0 bytes docs/gateway-guide.md | 233 +--- docs/gateway-protocol.md | 223 ---- docs/grpc-gateway.png | Bin 69618 -> 0 bytes docs/http-gateway.png | Bin 54678 -> 0 bytes docs/index.md | 23 +- docs/quickstart.md | 14 +- docs/sensor-fsm.png | Bin 69427 -> 0 bytes docs/sensor-guide.md | 63 +- docs/sensor-pod-fsm.png | Bin 45053 -> 0 bytes docs/sensor-protocol.md | 621 --------- docs/trigger-guide.md | 19 +- docs/tutorial.md | 1158 +++-------------- examples/gateways/amqp.yaml | 28 +- .../gateways/artifact-gateway-configmap.yaml | 14 +- examples/gateways/artifact-http.yaml | 36 + examples/gateways/artifact-nats-standard.yaml | 33 + .../gateways/artifact-nats-streaming.yaml | 35 + examples/gateways/artifact.yaml | 23 - .../gateways/calendar-gateway-configmap.yaml | 4 +- examples/gateways/calendar.yaml | 28 +- examples/gateways/file.yaml | 28 +- examples/gateways/github-configmap.yaml | 2 +- examples/gateways/github.yaml | 17 +- examples/gateways/gitlab.yaml | 28 +- examples/gateways/kafka.yaml | 28 +- examples/gateways/mqtt.yaml | 30 +- examples/gateways/multi-watchers.yaml | 45 +- examples/gateways/nats.yaml | 28 +- examples/gateways/resource.yaml | 29 +- examples/gateways/storage-grid-configmap.yaml | 3 - examples/gateways/storage-grid.yaml | 41 +- .../gateways/webhook-gateway-configmap.yaml | 3 +- examples/gateways/webhook-http.yaml | 45 + examples/gateways/webhook-nats-standard.yaml | 43 + examples/gateways/webhook-nats-streaming.yaml | 45 + examples/gateways/webhook.yaml | 31 - examples/sensors/amqp.yaml | 18 +- .../artifact-with-param-nats-standard.yaml | 47 + .../artifact-with-param-nats-streaming.yaml | 49 + ...th-param.yaml => artifact-with-param.yaml} | 20 +- examples/sensors/{s3.yaml => artifact.yaml} | 18 +- examples/sensors/calendar.yaml | 18 +- examples/sensors/context-filter-webhook.yaml | 24 +- examples/sensors/data-filter-webhook.yaml | 24 +- examples/sensors/file-sensor.yaml | 18 +- examples/sensors/file.yaml | 18 +- examples/sensors/github.yaml | 46 +- examples/sensors/gitlab.yaml | 18 +- examples/sensors/inline-sensor.yaml | 18 +- examples/sensors/kafka.yaml | 18 +- examples/sensors/mqtt-sensor.yaml | 18 +- examples/sensors/multi-signal-sensor.yaml | 20 +- examples/sensors/multi-trigger-sensor.yaml | 23 +- examples/sensors/nats.yaml | 18 +- examples/sensors/resource.yaml | 18 +- examples/sensors/storage-grid-sensor.yaml | 25 +- examples/sensors/time-filter-webhook.yaml | 18 +- examples/sensors/url-sensor.yaml | 18 +- .../{webhook.yaml => webhook-http.yaml} | 21 +- examples/sensors/webhook-nats-streaming.yaml | 58 + examples/sensors/webhook-nats.yaml | 43 + .../webhook-with-complete-payload.yaml | 23 +- .../sensors/webhook-with-resource-param.yaml | 62 +- .../{custom => community}/github/Dockerfile | 0 .../{custom => community}/github/cmd/main.go | 2 +- .../{custom => community}/github/config.go | 0 .../{custom => community}/github/start.go | 0 .../{custom => community}/github/tokenauth.go | 0 .../{custom => community}/github/validate.go | 0 .../github/validate_test.go | 0 .../{custom => community}/gitlab/Dockerfile | 0 .../{custom => community}/gitlab/cmd/main.go | 2 +- .../{custom => community}/gitlab/config.go | 0 .../{custom => community}/gitlab/start.go | 0 .../{custom => community}/gitlab/validate.go | 0 .../gitlab/validate_test.go | 0 .../storagegrid/Dockerfile | 0 .../storagegrid/cmd/main.go | 2 +- .../storagegrid/config.go | 0 .../storagegrid/start.go | 0 .../storagegrid/validate.go | 0 .../storagegrid/validate_test.go | 0 gateways/core/resource/config.go | 6 +- .../manifests/argo-events-cluster-roles.yaml | 4 +- .../gateway-controller-deployment.yaml | 2 +- .../sensor-controller-configmap.yaml | 2 +- .../sensor-controller-deployment.yaml | 2 +- hack/update-codegen.sh | 2 + pkg/apis/sensor/v1alpha1/build/generated.json | 646 --------- sensors/event-handler_test.go | 6 +- 99 files changed, 1330 insertions(+), 3413 deletions(-) delete mode 100644 docs/architecture.png delete mode 100644 docs/core-gateway-style.png delete mode 100644 docs/gateway-controller-fsm.png delete mode 100644 docs/gateway-protocol.md delete mode 100644 docs/grpc-gateway.png delete mode 100644 docs/http-gateway.png delete mode 100644 docs/sensor-fsm.png delete mode 100644 docs/sensor-pod-fsm.png delete mode 100644 docs/sensor-protocol.md create mode 100644 examples/gateways/artifact-http.yaml create mode 100644 examples/gateways/artifact-nats-standard.yaml create mode 100644 examples/gateways/artifact-nats-streaming.yaml delete mode 100644 examples/gateways/artifact.yaml create mode 100644 examples/gateways/webhook-http.yaml create mode 100644 examples/gateways/webhook-nats-standard.yaml create mode 100644 examples/gateways/webhook-nats-streaming.yaml delete mode 100644 examples/gateways/webhook.yaml create mode 100644 examples/sensors/artifact-with-param-nats-standard.yaml create mode 100644 examples/sensors/artifact-with-param-nats-streaming.yaml rename examples/sensors/{s3-with-param.yaml => artifact-with-param.yaml} (75%) rename examples/sensors/{s3.yaml => artifact.yaml} (75%) rename examples/sensors/{webhook.yaml => webhook-http.yaml} (72%) create mode 100644 examples/sensors/webhook-nats-streaming.yaml create mode 100644 examples/sensors/webhook-nats.yaml rename gateways/{custom => community}/github/Dockerfile (100%) rename gateways/{custom => community}/github/cmd/main.go (95%) rename gateways/{custom => community}/github/config.go (100%) rename gateways/{custom => community}/github/start.go (100%) rename gateways/{custom => community}/github/tokenauth.go (100%) rename gateways/{custom => community}/github/validate.go (100%) rename gateways/{custom => community}/github/validate_test.go (100%) rename gateways/{custom => community}/gitlab/Dockerfile (100%) rename gateways/{custom => community}/gitlab/cmd/main.go (95%) rename gateways/{custom => community}/gitlab/config.go (100%) rename gateways/{custom => community}/gitlab/start.go (100%) rename gateways/{custom => community}/gitlab/validate.go (100%) rename gateways/{custom => community}/gitlab/validate_test.go (100%) rename gateways/{custom => community}/storagegrid/Dockerfile (100%) rename gateways/{custom => community}/storagegrid/cmd/main.go (92%) rename gateways/{custom => community}/storagegrid/config.go (100%) rename gateways/{custom => community}/storagegrid/start.go (100%) rename gateways/{custom => community}/storagegrid/validate.go (100%) rename gateways/{custom => community}/storagegrid/validate_test.go (100%) delete mode 100644 pkg/apis/sensor/v1alpha1/build/generated.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 8180daef7c..e85b30c32a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## v0.7 ++ Refactor gateways #147 ++ Fixed sensor error state recovery bug #145 ++ Ability to add annotations on sensor and gateway pods #143 ++ Github gateway ++ Added support for NATS standard and streaming as communication protocol between gateway + and sensor #99 + ## v0.6 + Gitlab Gateway #120 + If sensor is repeatable then deploy it as deployment else job #109 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8950e3e586..a9284ce3d8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -48,7 +48,7 @@ make all Follow the rest of the [quickstart guide](docs/quickstart.md) to install components. ## Changing Types -If you're making a change to the `pkg/apis/sensor/v1alpha1` package, please ensure you re-run the K8 code-generator scripts found in the `/hack` folder. First, ensure you have the `generate-groups.sh` script at the path: `vendor/k8s.io/code-generator/`. Next run the following commands in order: +If you're making a change to the `pkg/apis` package, please ensure you re-run the K8 code-generator scripts found in the `/hack` folder. First, ensure you have the `generate-groups.sh` script at the path: `vendor/k8s.io/code-generator/`. Next run the following commands in order: ``` $ make codegen ``` diff --git a/README.md b/README.md index b0b3359af8..ed76743be1 100644 --- a/README.md +++ b/README.md @@ -3,14 +3,14 @@ [![Go Report Card](https://goreportcard.com/badge/github.com/argoproj/argo-events)](https://goreportcard.com/report/github.com/argoproj/argo-events) ## What is Argo Events? -Argo Events is an open source event-based dependency manager for Kubernetes. The core concept of the project are - * `gateways` which are implemented as a Kubernetes-native Custom Resource Definition that either produce the events internally or process the events that originate from outside the gateways +Argo Events is an event-based dependency manager for Kubernetes. The core concept of the project are + * `gateways` which are implemented as a Kubernetes-native Custom Resource Definition that process events from event source. - * `sensors` which are implemented as a Kubernetes-native Custom Resource Definition that define a set of dependencies and trigger actions. + * `sensors` which are implemented as a Kubernetes-native Custom Resource Definition that define a set of event dependencies and trigger actions. - - Define multiple dependencies from a variety of gateway sources + - Define multiple dependencies from a variety of gateway event sources - Build custom gateways to support business-level constraint logic - - Trigger messages and Kubernetes object creation after successful dependency resolution + - Trigger Kubernetes object creation after successful dependency resolution - Trigger escalation after errors, or dependency constraint failures - Build and manage a distributed, cross-team, event-driven architecture - Easily leverage Kubernetes-native APIs to monitor dependencies @@ -23,6 +23,14 @@ Argo Events is an open source event-based dependency manager for Kubernetes. The - Scalable & Resilient. - Simple or Complex dependencies. Manage everything from simple, linear, real-time dependencies to complex, multi-source, batch job dependencies. +
+
+ +![](docs/architecture.png) + +
+
+ ## Getting Started [![asciicast](https://asciinema.org/a/207973.png)](https://asciinema.org/a/207973) diff --git a/docs/architecture.png b/docs/architecture.png deleted file mode 100644 index a5515f4c8f2647d33eb6133d90509f202d83cbbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 130074 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%0AIgDkAyK}N{v|u3 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 IoJIKm0NfX0TL1t6 diff --git a/docs/artifact-guide.md b/docs/artifact-guide.md index b88645a4f8..b4ffc84495 100644 --- a/docs/artifact-guide.md +++ b/docs/artifact-guide.md @@ -6,60 +6,14 @@ Inlined artifacts are included directly within the sensor resource and decoded a ## S3 Amazon Simple Storage Service (S3) is a block/file/object store for the internet. The standardized [API](https://docs.aws.amazon.com/AmazonS3/latest/API/Welcome.html) allows storage and retrieval of data at any time from anywhere on the web. There are a number of S3 providers that include, but are not limited to: -* [Amazon S3](https://aws.amazon.com/s3/?nc2=h_m1) -* [Minio](https://minio.io/) -* [NetApp](https://www.netapp.com/us/products/data-management-software/object-storage-grid-sds.aspx) -* [CEPH](http://docs.ceph.com/docs/master/radosgw/s3/) -* [Rook](https://rook.io/) - ### Minio -Argo Events uses the [minio-go](https://github.com/minio/minio-go) client for access to any Amazon S3 compatible object store. [Minio](https://www.minio.io/) is an distributed object storage server. Follow the Minio [Bucket Notification Guide](https://docs.minio.io/docs/minio-bucket-notification-guide) for help with configuring your minio server to listen and monitor for bucket event notifications. Note that you will need to setup a supported message queue for configuring your notification targets (i.e. NATS, WebHooks, Kafka, etc.). - -#### Installation on Kubernetes -The [Minio Deployment Quickstart Guide](https://docs.minio.io/docs/minio-deployment-quickstart-guide.html) is useful for help in getting Minio up & running on your orchestration platform. We've also outlined additional steps below to use Minio for signal notifications and as an object store for trigger resources. - -1. Install the Helm chart -``` -$ helm init -... -$ helm install stable/minio --name artifacts --set service.type=LoadBalancer -... - -$ #Verify that the minio pod, the minio service and minio secret are present -$ kubectl get all -n default -l app=minio - -NAME READY STATUS RESTARTS AGE -pod/artifacts-minio-85547b6bd9-bhtt8 1/1 Running 0 21m - -NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE -service/artifacts-minio ClusterIP None 9000/TCP 21m - -NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE -deployment.apps/artifacts-minio 1 1 1 1 21m - -NAME DESIRED CURRENT READY AGE -replicaset.apps/artifacts-minio-85547b6bd9 1 1 1 21m -``` - -2. Create a bucket in Minio and upload the hello-world.yaml into that bucket. -Download the hello-world.yaml from https://raw.githubusercontent.com/argoproj/argo/master/examples/hello-world.yaml -``` -$ kubectl port-forward `kubectl get pod -l app=minio -o name` 9000:9000 -``` -Open the browser at http://localhost:9000 -Create a new bucket called 'workflows'. -Upload the hello-world.yaml into that bucket - +Argo Events uses the [minio-go](https://github.com/minio/minio-go) client for access to any Amazon S3 compatible object store. [Minio](https://www.minio.io/) is an distributed object storage server. Follow the Minio [Name Notification Guide](https://docs.minio.io/docs/minio-bucket-notification-guide) for help with configuring your minio server to listen and monitor for bucket event notifications. Note that you will need to setup a supported message queue for configuring your notification targets (i.e. NATS, WebHooks, Kafka, etc.). -#### Enabling bucket notifications -Once the Minio server is configured with a notification target and you have restarted the server to put the changes into effect, you now need to explicitely enable event notifications for a specified bucket. Enabling these notifications are out of scope of Argo Events since bucket notifications are a construct within Minio that exists at the `bucket` level. To avoid multiple sensors on the same S3 bucket conflicting with each other, creating, updating, and deleting Minio bucket notifications should be delegated to a separate process with knowledge of all notification targets including those outside of the Argo Events. -``` -$ k edit configmap artifacts-minio -$ k delete pod artifacts-minio -``` +## File +Artifacts are defined in a file that is mounted via a [PersistentVolume](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) within the `sensor-controller` pod. -## File (future enhancement) -This will enable access to file artifacts via a filesystem mounted as a [PersistentVolume](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) within the `sensor-controller` pod. +## URL +Artifacts are accessed from web via RESTful API. -## URL (future enhancement) -This will enable access to web artifacts via RESTful API. \ No newline at end of file +## Configmap +Artifact stored in Kubernetes configmap are accessed using the key. \ No newline at end of file diff --git a/docs/controllers-guide.md b/docs/controllers-guide.md index 1cba6a96b3..c5cc5161c8 100644 --- a/docs/controllers-guide.md +++ b/docs/controllers-guide.md @@ -1,6 +1,6 @@ ## Controllers -* Sensor and Gateway controller are the components which manage Sensor and Gateway resources. +* Sensor and Gateway controllers are the components which manage Sensor and Gateway resources. * Sensor and Gateway are Kubernetes Custom Resources. For more information on K8 CRDs visit, https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/ @@ -20,9 +20,9 @@ data: namespace: my-custom-namespace # optional ``` -If you don't provide namespace, controller will watch all namespaces for gateway resource. +`namespace`: If you don't provide namespace, controller will watch all namespaces for gateway resource. -Note on `instance-id`: it is used to map a gateway or sensor to a controller. +`instance-id`: it is used to map a gateway or sensor to a controller. e.g. when you create a gateway with label `gateways.argoproj.io/gateway-controller-instanceid: argo-events`, a controller with label `argo-events` will process that gateway. `instance-id` for controller are managed using [controller-configmap](https://raw.githubusercontent.com/argoproj/argo-events/master/hack/k8s/manifests/gateway-controller-configmap.yaml) Basically `instance-id` is used to horizontally scale controllers, so you won't end up overwhelming a controller with large @@ -32,73 +32,6 @@ Basically `instance-id` is used to horizontally scale controllers, so you won't ### Gateway controller Gateway controller watches gateway resource and manages lifecycle of a gateway. -```yaml -# The gateway-controller listens for changes on the gateway CRD and creates gateway -apiVersion: apps/v1beta1 -kind: Deployment -metadata: - name: gateway-controller -spec: - replicas: 1 - template: - metadata: - labels: - app: gateway-controller - spec: - serviceAccountName: argo-events-sa - containers: - - name: gateway-controller - image: argoproj/gateway-controller:latest - imagePullPolicy: Always - env: - - name: GATEWAY_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: GATEWAY_CONTROLLER_CONFIG_MAP - value: gateway-controller-configmap -``` - -* Lifecycle of Gateway in gateway controller - - ![](gateway-controller-fsm.png) ### Sensor controller Sensor controller watches sensor resource and manages lifecycle of a sensor. -```yaml -# The sensor-controller listens for changes on the sensor CRD and creates sensor executor jobs -apiVersion: apps/v1beta1 -kind: Deployment -metadata: - name: sensor-controller -spec: - replicas: 1 - template: - metadata: - labels: - app: sensor-controller - spec: - serviceAccountName: argo-events-sa - containers: - - name: sensor-controller - image: argoproj/sensor-controller:latest - imagePullPolicy: Always - env: - - name: SENSOR_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: SENSOR_CONFIG_MAP - value: sensor-controller-configmap -``` - -* Lifecycle of a Sensor managed by sensor controller - - ![](sensor-fsm.png) - -
- -* Lifecycle of Sensor within sensor pod - - ![](sensor-pod-fsm.png) - \ No newline at end of file diff --git a/docs/core-gateway-style.png b/docs/core-gateway-style.png deleted file mode 100644 index 4dc9c562831b95c02178d94493baa5b4221b95a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46683 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 Below are the environment variables provided to all types of gateways +## Proto Definition +1. The proto file is located at https://github.com/argoproj/argo-events/blob/master/gateways/eventing.proto + +2. If you choose to implement the gateway in `go`, then you can find generated client stubs at https://github.com/argoproj/argo-events/blob/master/gateways/eventing.pb.go + +3. To create stubs in other languages, head over to gRPC website https://grpc.io/ + +4. Service + ```proto + /** + * Service for handling event sources. + */ + service Eventing { + // StartEventSource starts an event source and returns stream of events. + rpc StartEventSource(EventSource) returns (stream Event); + // ValidateEventSource validates an event source. + rpc ValidateEventSource(EventSource) returns (ValidEventSource); + } + ``` + +## Available Environment Variables to Server | Field | Description | |----------------------|--------------| - | TRANSFORMER_PORT | http server port running within gateway transformer | - | GATEWAY_NAMESPACE | namespace of the gateway | - | GATEWAY_PROCESSOR_CONFIG_MAP | map containing configurations to run in a gateway| - | GATEWAY_NAME | name of the gateway | + | GATEWAY_NAMESPACE | K8s namespace of the gateway | + | GATEWAY_EVENT_SOURCE_CONFIG_MAP | K8s configmap containing event source| + | GATEWAY_NAME | name of the gateway | | GATEWAY_CONTROLLER_INSTANCE_ID | gateway controller instance id | + | GATEWAY_CONTROLLER_NAME | gateway controller name + | GATEWAY_SERVER_PORT | Port on which the gateway gRPC server should run -## Core Gateway Style -The most straightforward option. The gateway consists of two components, - -1. Gateway Processor: either generates events internally or listens for external events and then -passes those events to gateway-transformer - -2. Gateway Transformer: transforms incoming events into cloudevents specification compliant events -and dispatches them to watchers. - -![](core-gateway-style.png) - -User needs to implement following interface. - -```go -type ConfigExecutor interface { - StartConfig(configContext *ConfigContext) - StopConfig(configContext *ConfigContext) - Validate(configContext *ConfigContext) error -} -``` - -ConfigData contains configuration key/name, value and the state of the configuration -```go -type ConfigData struct { - // Data holds the actual configuration - Data *ConfigData - - StartChan chan struct{} - - StopChan chan struct{} - - DataChan chan []byte - - DoneChan chan struct{} - - ErrChan chan error - - ShutdownChan chan struct{} - - // Active tracks configuration state as running or stopped - Active bool - // Cancel is called to cancel the context used by client to communicate with gRPC server. - // Use it only if gateway is implemented as gRPC server. - Cancel context.CancelFunc -} -``` - -GatewayConfig contains generic configuration for a gateway -```go -type GatewayConfig struct { - // Log provides fast and simple logger dedicated to JSON output - Log zerolog.Logger - // Clientset is client for kubernetes API - Clientset kubernetes.Interface - // Name is gateway name - Name string - // Namespace is namespace for the gateway to run inside - Namespace string - // KubeConfig rest client config - KubeConfig *rest.Config -} -``` - -* To send events back to framework for further processing, use -```go -gatewayConfig.DispatchEvent(event []byte, src string) error -``` - -For detailed implementation, check out [Core Gateways](https://github.com/argoproj/argo-events/tree/master/gateways/core) - -## gRPC gateway -A gRPC gateway has 3 components, -1. Gateway Processor Server - your implementation of gRPC streaming server, either generates events or listens to -external events and streams them back to gateway-processor-client - -2. Gateway Processor Client - gRPC client provided by framework that connects to gateway processor server. - -3. Gateway Transformer: transforms incoming events into cloudevents specification compliant events - and dispatches them to interested watchers. - -### Architecture - ![](grpc-gateway.png) - -To implement gateway processor server, you will need to implement -```proto -RunGateway(GatewayConfig) returns (stream Event) -``` -`RunGateway` method takes a gateway configuration and sends events over a stream. - -The gateway processor client opens a new connection for each gateway configuration and starts listening to -events on a stream. - -For detailed implementation, check out [Calendar gRPC gateway](https://github.com/argoproj/argo-events/tree/master/gateways/grpc/calendar) - -* To run gRPC gateway, you need to provide `rpcPort` in gateway spec. - -* To write gateway gRPC server using other languages than go, generate server interfaces using protoc. -Follow protobuf tutorials []()https://developers.google.com/protocol-buffers/docs/tutorials - -## HTTP Gateway -A gRPC gateway has 3 components, -1. Gateway Processor Server - your implementation of HTTP streaming server, either generates events or listens to -external events and streams them back to gateway-processor-client. User code must accept POST requests on `/start` and `/stop` -endpoints. - -2. Gateway Processor Client - sends configuration to gateway-processor-server on either `/start` endpoint for -a new configuration or `/stop` endpoint to stop a configuration. Processor client itself has a HTTP server -running internally listening for events from gateway-processor-server. - -3. Gateway Transformer: transforms incoming events into cloudevents specification compliant events - and dispatches them to watchers. - - -### Architecture -![](http-gateway.png) - -List of environment variables available to user code - -| Field | Description | -|----------------------|--------------| -| GATEWAY_PROCESSOR_SERVER_HTTP_PORT | Gateway processor server HTTP server port | -| GATEWAY_PROCESSOR_CLIENT_HTTP_PORT | Gateway processor client HTTP server port | -| GATEWAY_HTTP_CONFIG_START | Endpoint to post new configuration | -| GATEWAY_HTTP_CONFIG_STOP | Endpoint to make configuration to stop | -| GATEWAY_HTTP_CONFIG_EVENT | Endpoint to send events to | -| GATEWAY_HTTP_CONFIG_RUNNING | Endpoint to send activation notifications for the configuration / -| GATEWAY_HTTP_CONFIG_ERROR | Endpoint on which which gateway processor listens for errors from configurations | - -For detailed implementation, check out [Calendar HTTP gateway](https://github.com/argoproj/argo-events/tree/master/gateways/rest/calendar) - -## Framework independent -The fourth option is you provide gateway implementation from scratch: watch the configuration -updates, start/stop configuration if needed. Only requirement is that events must be -dispatched to gateway-transformer using HTTP post request. The port to dispatch the event -is made available through environment variable `TRANSFORMER_PORT`. - -### Gateway Examples -* Example gateway definitions are available at [here](https://github.com/argoproj/argo-events/tree/master/examples/gateways) \ No newline at end of file +## Implementation +You can find existing gateway implementation at https://github.com/argoproj/argo-events/tree/master/gateways/core \ No newline at end of file diff --git a/docs/gateway-controller-fsm.png b/docs/gateway-controller-fsm.png deleted file mode 100644 index fe8537f0dd3d5ffdfa85ddc19c22a7e760248e9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66725 zcmdqIWmjIovIYo*Ai*7iySux)1q;DRaCi4Wa0~7lEV#S7OK^90cV@qwb7$_%{DPSe zthLw6?(%x7y1IAB7X?X#PoF=5fq@}NONl9ifkEs5f6FjXz%N3IW2s7rV@svu1(G}fWhcRBhu0_y2tw6$=TJSm^Gn>$}4N1o3XRlRSQd<+2v64(#pyhVUZ@b)$^MR z5gtOD`}`Y`MK;~w(9quMy~$u#f(R27W>-uMgoXRRw+TkeabzX_C>FV_hWA#^XO}2{ zKZ{OuP}7D_M&S9CZQ~T!~hI`&o1V z8(Ipdw~P#yN|}k0CV?(^1ZRrJDing5ux%5tSF~S1(xa%f;l6p3VF}xnRe_=HhuVsJlCY2 zTGTvks$RW;7Zq4jK?ojd|5Ujx2lCiDGK61jol8RarMA>L`VVcxK3Z;W){MnIbUW{7 z)G_Tg1o5=t;9q1nDLf6cEz_qvd!SW95He-Iu>Rx!&#>X2F;3k$Nh!c#P-*H1jv7@d z`(lUE&Un3HO&C`=yx4BOw())tU95{xAvIVO1FbeE7E&t1RGdHr$s;91WP6xksa(@9 z12)sz!e{uVN&aWfp2}!DrJ-!qJ%F88afq4O4wdLEIPB7#+rae(I)y1i;yr}nV7|mP zgYhH+mL>9wgMn07zKw)5BlY#f`BxCHbsry>_JCT@+CnO$`PGs?umEK;Cub+eP%O7d z^!c@F?l~<8qGYGH# zz`X=MTd|nvr<=K|9Jf*zw${w)a4ejwT3&_CuG*&``v`;oa;M{7*-!sC6ADs-sPksO2YRP2}bFE-^X-ybECe~ zYqduKkNEpzt1NaPjytT^A>UC{P7Z#Nv)GRit6XCCn42zxmt!p0s2#s|1$vxlm`ndW zv_t>|VPTY;2q3#Rj zw$}WrB?RPMM-d=EC?mHyfae-V|de%Z%R^0r+&!{*3>F4KO5CY4YWD>(JLe>$cHl)@+Nms6T0xSO$!E59c=WViN9 zoh$#bnKXXBGmj&6v~?9@1-B3}a&At5NAb-#&>m`TNC+ui(drS)-6ZD(BTebgxc z*Wl=L%eoKus~w-`qoxGXoCq8N6^N6pf2J&e*mbaw3NU)4(x#8jet4#;rG=xZ%psR8 z4|AB@r6x2$SP^psF`w%T9O7aX>`e6w@oYHv?g5r6CG;d-OD^00SjZRBDo zt>!CXY%|_NaXfoN7_{RBvh2{(lJIXh?OcAm_H2ipJ>jx;I*{2!fKy`VX@oCH=9n*U z92MdM2jz-sG>|w@=@PNhfM;d1&I0h&5Mu1==Y`eZLI;uo#r31n@gD8a{#|BctI+91g9IPH>dq8>SxoS=3;4 z0u>-k?dIIa2CpM1fy1|uQRh?&*Jrj*SL$b+FO^->o!-zV9Nd%uvJ-(vAOj`}&NZa~ zOe6q;GiRxvs&%Rxe1#gX^v#wu*;H6N--BpJ=m@@govZuvS)>R(1OT@r%8*kY_H+-Mvq~rNIdPk*Q6QE+6PU7b&-Jo9Nc)t8KN@DebNGM(U1&_nB;UoIAd65g9#KDOE`!|Z| zzlu*eIT^IcS7`l+IXeFivH3jN1U@r8=jDk7YCAfj?9i{S&N_ukkHsoYR^FTK5ZYU& zDaDXA9>fXP&K-0gEq?_0EJ+f;T0R9lagdB0DA?>W9Ls~q-kLFgy3|&^@He*=Jaqg8 z4uh>*p=ow#^DSPF&zO&b&d{?@wzk3;CE+`&dL81TWD|?SHNw6U%g$O3Ws1v++j+g- z7%sQFV9A@eh2g+`rP@N(Z7;KDAIl*kd0xZEl(KA0l<)AHBFxu1O~1&hg``H?DOqaX(d zqC?m1@Z@A=jFL#ff&X&?mm#r&3`ijwGQj8}1rua|(O*zt(y-ekA^zU0dE%0<4VAVd zESgF7kFR#z`ul__(0LRf+!mV`m~kV3>{6Hk#PXqz*auK7D`d^pr?R@ac?d9JlU-Xq zWso7lZ^pCvapj`0CY=1<3TOF|V^BTv`e&82>OJyYh&nRiPuGo3e*^7g9^|9Kr!&*& z$_D)my7Rkgn>o}(>k;9wpkJ9CJGe+v%6|XQ9VEuPl*Z{D{wG@$Q zS6yE8pF43lvB^)r)rTM>Ga4h)gT_P?Dh)L&^e8X?%TP$^6j67V01#JOQYay>BV+@K zOnPX#)=k_{&gS8}FxDG)K@ACdx+;s&7-~D#BzxY3*00GTExqbHtefXX`>DMEoUkv) z>B@tvE?19gJw1IyK7Jy`Vju4&U5s~K(M#joCH1iF;PR|!uaqX#W7St*C^}U^5?FRF{1P%5FgyGoyDCtemUESRuCY6+ucrIv1p1t9l z?r_3KkGdyLa{Vx0a-!p0x{=blGxw|^s`%W^ZBO3JI3Y~A|6iH+6$s7>t8_Byh+epi zO>spF1_!amfs`P+^sv0*I#M2<&pICt4R*VjR7;dUygCi%itHTjPq#99W8ZzOv(bpc zNPX?d4MLhI)e(KJGNxoP90^z#NRJl{HlMYEx4WM>Nu5K%e#RkKZuaK@x`f5$oq^PL zqQ@J{AYa6liRL#-Y=H{O+vhfnSQGl*?3ZR{>ucNpmih0aU$@R4_7=TLR_v7HDoQdj zwVOlaV=s(>oI;%d1KM8%t`G{Kfiz7Nng}@Wj{cJGF&rv&X5hx(IN#Wq(;{=TXu4R{ z3URdevAV+G2nzn;7}wEe4ZHnBAfiSn)lXngcR715Kum(34S3`eJ?95vE^H#0?ezWSC zp~X^a?$VmK+lRQ^9xWds9cFp-nMaIYEzS$x7bbKP+avI!(%R@HPQv}l*q;zlJW(?9 z6nd^(zs1GJ&;R>eTv17p01G!P`|Sxax!SO|CPa_eAb(^?HlPzI8Mww0SyDZp+oiywkeemP|hEwH%GQ5U5-G9p4vwL6>_InS0;Iu3^8`S!1yn4g|a* zoP_m95$F#o67Nq})m?`9xk_J;6m6L*l|#raIBW6O>ED3!xj*7f#`IfML(epPKk{tJ z1a+#@azLj#x|(eTxFm%FnT=Wd8jmlU(nA7rTCt6?fjhOu=MJ%{&dRr40Y8dR;4TrN z@N2QIXW-+UxL}{pY@r5j_`@sZ{bPRjEmeA)c>2?G{Gs)h7qI#OpaNC%?tz?K{=AF$$j#K~Y>TSxbh1 z*UzMVQ*kNE77|jD&Hk|4kWKL~#M`~(O%1_3j!L&AWkE=%v~QWN*374aTS36)!{Yf{ zDkq%&%Gf_HpPMqO88a68hFf=!k-`7$kxD@Y{t#yo=s2?6Kn4DeLn=vQvvj#o=fW!J zw4nbf0)^|o`aZ=zh++57VEu_;5SkBdd%!iQPoSivA2tH@2_57B8J(Z$VF2(neDLcC zSrUjR^3o}D6=+dktlB!H-ywAm*rWXd(`esrd{FuqzkP51BOad{MireG4}HTd_RMFQ z_gP2>B0%T_?6(R~^rMB8A%9W?hUK!D#Cg(kKI5fP&*egQ-DP%XGP3M=O$Gc-tbAt=GeS@um%ko--}d}f@>GFv;x0z%kLU`?hx)a*faUU??$IOl z3%f7s+XKmP|8{=?g^hHf@fXqCzJJ2E`YmiR7YurxEA^B9Efb~S_%EirMD1akRq1u_ zvx7Xyni~YGgHx^ykQ&-jMEcXxXWBS6l5XzqSvE^plvbMVCku@jonE{K|JkF;KA(tK z`pj420R3(0^GhC_kHPW2VuhO*woF2q?{9-P$uaHnY>%ft&_2)cgk5N`M3Ubp@*uXY zuY`InyGhS$=j^g2fiUyqU0-lH1u+22Fd97SD6cuGvX*l25|DQyZ&8vYvUPY#+-~s3 ziuhrU2dwL1XZhJ~M~L%PcI*n7T%lR(;}{!0d$;o8k7O_g6r)NCFtxWSmsbos+f)0F zI4vf341@+Jd@WHRt!jh-Jb=^90d+emyt!9( z30>1*Nv`1X@ojqi#Ep=EWb;Pap;Z^1LwYheE3-;^UXcp05(viEnl(7=DQ9w}VY!b0_ z(W%m~nK8oaew!P!j2jH+GTF@E0;|@YWL4^Y;{_Uzp-4{30f1l2XSdbF?y-xW`S_{G{{|}-Oh*hHxb*+ zF`2;-2RUk~f0F!&58@Hy%QyP%rS$KN_pvB-OWd^Bjf zxrRv@i7!$N6^}moV!ZKVXgFh&e7w{rO}tM|<4d+FVqCd4K3t-Wgrg&R%0qnT0JF-M zT;~tZb=KrR-68eOzBRD)seU3=z)Wvsg0DT|tQ};m7QGuB&;3D`OE;52piR4+Kj_K| z${JH&-(Eo?whGFW_o(|zj9g)vEICHIa3&oSSLBsjHIPi6-dm>w%;_?b9$=bXEJNB| zj^iG;n9O!jYYMdpG^&jIQ_e}b+)W8r zZFE_^Gwf8bI@(9Ws<1A8?lzPM8m!zJNX2rLUMicGy30?L-i3+XEGNgFpA<&Lzm?53 ze4NU^@!LlW6>9w7_P)nT7OY5gN4Y$AllP%?b)Xyi4h0J<446((?@)v=UNk1wb57;S zM(yvL4oKvZl*!|3$=wByXYhF!##IE5(>D_EduGM8CLz+JCVT3wVYQpm-Csa!x7{mx z7GTTn%5yotg$&QTJfjjBTuke?kIjyCKY^;fkStK7Yq#kafn9x;G=wl(*OG7-V_n8^ z(d?+Cr1(bI#!K8(qI|Pr_C#vJ+!*EZQh93R`fO_flMGCfz<^Do=AC>qh)_ocsM<@% zI{XGzdsImGQJ(#yo8t=u*ciz(4z=jMB^C8FG5&`>_F<)p39TX7%sOpgSbfjzNJun1 zsjIv=5(}jsQDY>q`hIkx3Bnc(#YqLgSn_BvX~?gsWZAm$fPH=IYr`lj6=* z1FYTw1QqBfc8)DfL}JivN(VHX`i0vF3q04N{m(ckF)?U)r9H=R+_JF{#pik7?5ssaSitOhG?#LGb=N@5>YDu-G1q^DMUQUFOCNmcOL5gig)uDvp2;`GMd@}Gt8>d z?S zxV(h|XH#`%A96l!0^K^3*{rf^xf)>%+4rY}8<^82oV6DwB>E-iz7E~9Tu`t1HRoE^ zB810wQn}Ld*WdHoy5-3Dc7~qP)VcFX-wlqFPDh8HE7K7jCn1hL9P(UCR~vWRQGVy- zq}X>sBtQdz9woL|AV>&70{|^bY2~dLn>|0hU-c!cai;Qxc#zjKWIF+)0g1>*Xl*!t zH@t5>NpBxXbspilyf&#`=c_-g$vvU~bwn8G8@$sv5Oq9|R5hsxmhX525%&FP6JI-n zC($O0JhJRb3ieA_JPyA-Go8X24ribNwJM+>5sRn(Z!R6RH!(6a%7VMqk`E%~Ya6Ua z-=bNk_o!uh)ZKru4NIZwd$-ItGutW+lR^rais$5`*7m=?dTB<{OiarYC^wa zE|brV_oQ7fRd?}x&HACq==Tn0P901O9n(rKW(s1Kf_xgt_L^)RU%$uV=PZNmjdA;@hq@zT8fNL< zB^&p5L>oIWO2E`_^l6O9>k*#OtBuEz`gFCeXvAvRX#<#mEZCv4AfrJWWP{E)tN%|F zAO}!DZG6)DKPZq=(@JRg0F8w7VUdF>0xww)PtE3(+UOqS!;B;?FPno<@%Qi_mtJm9F>a0%bal!JZ#K zWos5a&wD-7*l&-N8V>aqrK?#?cW%6RobPXVIi8{zmJODNH$O2!Y+jEwa7{v>yyPR@ zdOUD`C^p&s&ybEEFx=u54n4?lu)w})K$ ztVw@PIZ}-Mqua>J5ST=#Gem1!859Lv=`1Oy2E^$0+_X{-!wL z|FQQjzUI%oR0&qD*KJH8{P|O`-_NUk%YW7h<9FNLofVh+K9VPkd79da770mirC~RU zm_QUJqsv$_=J8#&czYDW`oPds9DGVkp>+Dc zX4oDw|JMw=!TtfF35xAYQ&sTrw3X3Y2EI(l2qkI1rgj%9u8Atk_8ox)ShUO9kW0O> z)KZ-trd66hFnE;`G6AZK)9x2*;3QN?3ld6xIhI{Bl7~im;O*<{v8i@zQZH_BcyO@b zB&$}Wwsgk+!}S4L9$T;DmoLCsUCJy?p5c(Z&)s>am(j_HMpc`ksJ1p9P&^^^)*R0j zuJr1$?P3Z$^(*!vm2f&zPAKgz9=(1OxBm#grDF$9a8lwPaa;DrG`+eV*V_p5-!3V)?TWp^=|5f4Aqg@Uv1b<9_n3;m zz;N7DJD014kFJ8ycEP&trOl?Ll7{4TeSnv>aU7i~nb562jGSr49Qv7U#RCDfu)mW7`hnI@$lA(VSDTsnm z%J#Jp1vluCRq&QKyD?(oJveP4fZ(JQ+C>G4rBCe_)ps&>U>3Xz18W2y6X31}mn+qo zmY}dzbz#D=(r42=9(vrcUu91;w!h-I+kdv=oGh%J1lnGzDgfKd9mE_rfY7OI)=}Yk z%>k=EF&QMxr(c)G;x|<`Bo2W!e}CD(DUmr7Hv7VmH5X5 zQsfIbAQ1+a9|fpF3dsOfG0=wsJU5;h^~-aFcA@g6)1RxGuLunVzm-6}mO^Gb`67O3 zJ$D2Pe5O2H8M_3##1!&7A!ZOE-k^L?x8xflG|_W@Sru+0Mjm$03&5KUmKy@bDm9o5 zBT}MYXlO{UADX)D@rY9oP6T7j77GWiJ~jt=!!Al9PT#NhK>ABuv*@dxF%pcC^p6i$h7t+z0?sCP>(XRp%dWx0 zoP_I_qe1qTmT3nj1DVk~k4M+{B;&ZGZ(-=Cot02L-zzM6SeOAaAm>W1QiZ zy00qH2I9Y`Kf(<*oFfQVr06L!wu#|?AI$!_ z5|`EokxcaZJpH){s4t+*`C)LuC-ck*1$3jX1o#EdE^;MPdVHPal7m$>&@n9^p)5x) zCeAtvm8QZ({)Zt4h#@SY4S@AT;5R79rRc1NBJ8;+PUHhlM$$C2)LvS2EruE}))!T~ zUo|)^-ELK1y_b|u0Hb7Ptf-pv|c$QrZm*x%tg{YJe|9i_EPeDWCP{PbnEX-l} zYcfgvXPjDK+D%l%Ra^OV#S$1cJQ6(9Drc9iUT7>~&(P|fgJ4*jpn06$vsT*S0t)?m z2mAsEHrvnvOOJfH)3P?-@js+;- zg5t{Xz7v22R@r*bvS5%nCs`KF~3{* ze@_xIkoEJmKPqIwf{ec|0&rsp7|(l;ci>J;TIKtKQ+Z&b*ZMNP0(6yy0RTxEJYm*% z&f@ z4?+y!P#CZ`D<+7f&`02Bbw4!I|JVX_zz?_KU=U3h5@XbVfYfs zK^8V1!ubGN3A&>ODDx3S5&$>jA+>eLl=t5mfCJuBk$deF5LG!qH5@q50svj8hE|r| zmiYncWB`)IJt%Dcpm(%EcZn5WSEs{=<;b8E8t3#pQ z%YqwZ7x*-XO<|LyQe5$pU`-_Cw2be9TCICuqcbyN+VGOjR|DOgjiDedm;pOt1YD(osr?Q|~9wbp&gD50@>4)tyF|-Ht$8UB7}88YBA7Ee!OS zFvO`O=%v#=p61geJAL)Ev|~MpaN5A1V|sC9l~Z+Ko}=CzUGi?&9zAbBOkRdUw}T<5(H5 zG2T1|CFN5h*j8w^J}mhAOXSvj-+&}S1F@UR<3Q2Jn-7TMq!jhF>zx3g{oT^2^$wt< z1G0vQ7<}cK>5rD0xUXFvjZ5Jw_B)Y7g9xY?UmDo`UD+@3j~r|S^P)c}L|cUNczl#`_5K-1U)xQ3_Pxuhk0NoPoqGodU&%Wfeo%cA5qf_q zWQiMq#tt!%Qyq)sA+e!3Hnv6wk@dBi+31L~K$foWIl%)}0HrZ(DL^bi_=B%%DEit( zL->C=B|t>V9>3-Kk!8t1G(DiIlIxsc_i{}{me&|kZ^_86+P9XzyJ8L+jh+ac{@oRr z8^r_0eSV>7*`zAi>OA)OXmvU7J{764g+-kJjOPh^IKer#jJnm4T(e?A-xvRMzevD4 z0}A>jQamnb*akw-OHG+a$4v%(emZvcRX(sldVTu;dU`!lenIN62YUgh1Ji#*J%(8K z0J8#r&i8@0ZWrzITMF_O1!F41`>9qRd&mJqixY13GB)gddWQp8B^U{~A+#-)kS5qF z*wnliyF%eti0}`!?h;GR%w;tvf+kw!!=S`*#@Rw@n<;ZZ{HMHvJnL)*)n5A?pcmLKZA#+qvLQ|mzx%+r&%2k`eDJe zgh4JR`%?1~i*Z+PpW?!Xf4IA8C3P8VuqV@b87(aa_|ED1+DnqHn?mFt_fUbAkh`#1 z-HeTMeJQu8vBcSu8D4d0J82390A&vvS)B|RPk!Sl{d!ugo>ONyn38W@pS@&b?#{}# ziV2|$<_$RkCsad^cA*PgAO@1w7D(DM5ImyJ0ZH4y?Z=9{6d%g|c}^z!QaFKekf4v^ zj18XuVE5ay{gVlY%afXAi&U%I$ucS!=Ls@|Pbre=)^CdLfrdg#J#;HPk}-*Oafm@w zuG&f+4MoLFx5~=jE1{gvHx;u=O8-3%NE2J1egq?K!vvf1;U6^OR%RJU4`tVE>ykFM z#lb-4sxG=}#4A@HrrFTIa#Gs^bzd< z;L@UyF6O!&4St_Y4BNM35{uPO0~!@j)_RK}PjiS=xUqh)y|@^JG}5`@i!0RhiV+~V_rz9J{3**#$gd6uJE+F}vHqPUjY~m;vS4zG zhgI9uN3lsG{bYcrOq0l3pg7`m?ny=q(tj_TX!Cql6~y_ai&)5)eSWks$c+ z=d77Z`6Q9osD`j zrty95)#_OP?J0ZNFfXOe-}(t9iXrR==45+|>_s2(P?&E^jXY6aiK;U1Klgl@rPZmx zn_a{H*d^HN-Np0D)>63>X&vPwvx@_K@y1qC%J_#{NXUD>$gsckxPOdMCm^EjldXTZ zw1k^^dTktR8Ju5U{7Q_9x)h9JGegG0|CJOh)gu=ACQih0*~rYp0@1f`+U+AdG-srt zX%YR0-EKU?#=7OZKeA+tREH%*j`y=8j~N~rJSu0%{sstDi?)ymR1B|CEQ=6G46qI9E?ltI244){=#pR`!+0I^j}PY%*? z1kF~4A0ih|`h0h72CLW}^@v|dcBrK7XGLs?Bqx6;N9KsHC*Q_j7OIYhLChCVlQhcY6v(5{{nxv`#veDs z2}q4#b;vrp*LRFYZg-cUh`Xv=Z#ei`T2G9HwH?_`U%U|O-yY%a#^0>i`g*Vpi4a+K zJ#c?W&cbSVj9Q1;k?5c>)q5{5%Tt!HCKBu2uwkcEjV)`tm*Jbpew9H=rkR_XTRXfR zilmeb)Npv|4WIu_uXq?kk`rIxg1&RqLU6?fTyP9iQ*a6kV+ULt-#v+VmkwwbedR#bPO4{ z;z5;ib_)CYPU=|bf@L%L?g6Xzy%(i59zWf16`gROD31M;M0PR90tf5aEDw0ek%Gvep z??nG;iU|sORv4aDzU_L$uliA7WSOyhx=_v4$fBCCwJ9b&OuCzbQWE!vs{!pBB9oMC5BkCJRdKPC+ z$eI$8!Arz}bJQUGN8{1JsdV0MULAK@6USGp$?=TM{T%V&2A}ckCX;Zw{?<9u-jokx z^?|fJKYfcqp$G>GMWZJ!cB8!Mw4$o?nl_UO8Rs+&2dBR5l#FR|@qrnqUG$x=JtvP} zOE0AZ8@5pY&;i;=Y`1y@H@G0REmUPY_K%$_lzV?Cc)6yIWY9pjsaLE!Zg9B`H|@3W zM*6o2kr%#fLP=Yo6n7&lV}+)`@}NQbp5E997E4fYTN3w~Rjm$XZf`|% zJd)Mo^szzpDVC>}uQivdp6IJlM@5l*SOnOio5_H0D8EN<`*d>LgqlGgA33i9Nyf&y zq66~Hc1R)f+BB1+8tE-_J&}+qlWOVB)@}}n#UEwDg1nNr6c)9jSf_Fn_aP9Al=+#V zSRVHOu#n)axy_`Ko+9#3q#SZNf?Yda&}-5<=~~8n%2;U)^LN-2ij2VUz+JL+n`eSU zwkw2#Eo}8()@B1mzUt*xO;WtFZ2pk*<71L=IS8!Mu`)G1mG=%o*l66hXH%M*$SDK0 z^Kn4=gqLU-*M`ikfV*pMg#3hO1hu&bT$D0_(WBBkO|@xbD8B#L9G136-R2(1NrJ8&BxYBL!dh}2Z ztAtIR1Q>nR#Co$N_S@%LXLf4>!LqnYwof`U6BHj@tGi)>A1~TT>=mNPud%{Ra{zrl zmro}TuVHzF>dz)qB79-gpjJ2eJA$CdAL&qk>}oHtZI)FhUat!Z#m>nW01`)oTM@wN zi>0fcdEuc{50;S3Sd67^7%T#8|Hf)EcWCnF5D50Q9jF*Bn8p!hD|bg%ynLk_*TMrn z@cNH;+z$U-C&k;V<jwuRYv-gR83+sx$oV z0b~Eq{q1-@a=6(gMDWz6fv+Tn+}XCo3l{K_%5QE;86iRD>M{T(#Cv%he#JE#<)tMT zv2dc-@MABzJXF!Y2#A4s8kYeo zODa?a=v}wEl7_=B@+nz#W^oZlxItwCIWImUi%Xr2H{jeqh)SWpXt1~rxP`IBvKZ2q zv_{Mi{%|Q{b=fP4V`Wiu{-iXc(0$x+QuclJ`JJQ1 z16n(KlLdwq%hyCpo6fX(BFRx7*G@jZHfIE1zMPFqwY7QppJ?C2)~^?R?ImC>$fbu) zcG6KEWNU;!uO)hHYq4c3Ks6hrH#P%y#{GLcqMF>CKMS(2UR0yQ?D8z76A}R*X8KAr zvjLB*yZhoCGeg=a0SG9mjfS+I&H~BQyowccwu@C47|NXEY@MfDe*9CvJ?VY0(jxxQ z{Fxr9x-77t;do6+`HClV1N^>d2cYW}%XICYhBs-hO_GRwb|B zM|&iacdYm{fxUi5dL_LXX(I1V%5uJia+TPj;0;NKm&2b-`u=KrZQxE*!Ei8!Sv)A2 zcg#*#(al)v5XhR?@6FsqL@H^_kAA^%G{QLuKPZ|X=2jsVSFgxd_pgGYDr_FniHElM z$jdEnL_`P{5TGb!VthR-66cDRkSJuLfA)aYmk@GtayaUmSX+D@(hhgWHi?ppC*VrD z?Kp05XgOfeaL~$}zIk)S+YFZo|GWx!;OSN2@@6+}wTh+nRZ%is6JwH1pGd;{l9(pW zgHpU75RiLS(H+Agb5$vha;p}>Dy2SA|DIbX60h+5yG`@ctggtS?$w{V&JWcln+q$= z(c$(&{uspx1;C9oEk)m(t=Y=3v3Gd z<63c`2)hM$Ph;IDbFH&_LzOp6r2ZZLW^fz_+`zz_if!FU_Dry&{!x?oX(|4h#oZqHC{N|ktyUPurI=kL@ zo7j1w*hii~hK@>;c)|3WZ+)ON97-a= z5BYqV;bvoJZT{7NqO;4ZiibHlITu%#@=5G2A8+yRRqVd*d?MG0nydYvy8tM+SFYPb z$p~jIZ|I`Xp1v%3p_`j|M-6Z5%tHwbp#_Sh6K7j?RC@W?5FWK&X4+@qYeec}CHM9{ zl0%*wyhu4F?UP&&{VadvQz-<97M<`Tjc9fG&5fStK2*L<3>pf;oz4w12pgRO8<@*& zF}Ku&dT?&Z(hX9u!OA2$jQNDfdRehSmbxgEsNdUK2#MuGR*Br)AtFN4QJHNwwy0!~ zp@P-k%ZPrz3&*r$E<`6yF7=D7q|)$>UFOkmM`XB1q$1=k&GKaomQ+TJoVC++|Jlzj zqbMGpuK5I%Xy~Y$11CM-z?I@zdE9de6_TU(Q$*lEUvz9Nn$|&^q z`X>G_!l$}_CDe)rWfL4OX{6z+>~;`8NJ+P$vWxl1lm@znjUf_dqmF9h<3@>MlZ9lR zcBzf>_Fa}pdzR(mPiVPapgfHFaSS4_QfI4nBVCp6?jC4eo8@GedEQc$Ijx(%maGOc zw!NSP`RJ9z6(#|nH~IGW_5E1h2M>)Vd|AOW9E$^g5iq}tp~70Yp}|-aU(2vU#>Fi# zoMY5&i~Jie)4DzJOR!v}>MUnC>>xBUL>RcRyZJcUJm~#(ZoJKeBLDV!EM44j&^DJyk{{O z%eOxE$ucJ|&-pXj?ZI@NhbOdxv8@%F6XuOnVHq8_F1s9b<7FhcN|#~2yxZqoKZEo2 z4TBPGo>y}4w)?r8p|GqFakmvs47;7hQbWOFjncH0Zpyp@ms7eSaV)T0rkZn8!H|Lx<0x(-h6_usuX#dn1N3JBw-S!p($8) z^HrHbDTC3bEU`yzJZqBb${Hmo)EE-v>{Cp8a+5ne{yjKN zJR>*??NEzucRh>I z(gO+X)vY=vcMmb{?t5c7EpWbOU_ExqIp|w(v0Q7@P2zAGT|>v>VcBBEv(7GJ=4cd{ z>%CevT}2fb|F`W-ra-OP@#{m#1oAS!15^whrwwwGdBh5qtv~ErDPbl&tXHq|Xc1w3 zO?=#dm?yt?*=2%9Ap8N7!6xPYe3{ZSmTp&q%I0s~xhM&0J@-xIAPR)P+&yq2aq7iu zDsD@Zw*Eg?6&Z_Bm4QOJ~Upj{|@W^2ayG20xI_RL#R?+U0t9dsjVoGTRE}GXzYy zSH1S=;juZuwdO`TrlKP*d@yVKu^4nDg%ZEZz&oEUYd?6S=2#!yz5r#{Xt~XSFevgh zuO-@)3ET2DQdJAU$(t=|VN||eMn#h9bb;10S<&9%EVC)#qkSxt3%uXsnWPp8azl5` zg`!xSI@+-PA%bDBCPUwi=>%Iabu1#nnoVD*K;(?X^CQc3@t>$zU;xkE5RZSf!?7TejwkaE zN~@P*r53I0GCmoI`Kr8CK-b5Zom%1jaM$2=L}1Q-8iD5X{E3lqJW*5n1@#eEA|g4W zc9>$LueABxhA82o=>k_|i^;^DiaB{rhV8?;&d2oYOBYzu&&kB^cYG`=ib# z4@bM;v>0fi7dKyKETGMQ&uY}5mVGXp#r%=qKf5JyCwXg`tki6ld7oGz=alb|?+w83 zs`!(2W{%ZxlMH<5<5Y5NP_D!b3zcqV>1BX;u!G%tu&ED4&+l`e*Oo@)`|n_(2{!)V zUW>W%VLaFmqjcKM-q1_4V^SB`HuON#!pfV$6i`cGkgxZD5cZW}QFh^yrLGavj1N)EhhZ2L?&ZvPIz>`WmHIsHyu3Co&DxLnN1~sk)-Rbu85hjG1%hC7lIL70ii9>`m_ldVpAl{NO-B2* z3VR|hnUudR}I@eE_xDOb*Z9)d7wu-ud(fXWcv+J%f!@cXTJCn~Jw~h;E(qB6FrAb82d8B;!^uy?t zl$7+k9A5!B*l&>m&D@DYPu0jM=U3)}^m@C+iQ`v|bgf4sw+iu7i*l%tolfp6a*Cml(1Rc(;Z5KPq<#v1uV?7^lOR+UK@mr@Y zSQxrCNSEv0_Zgl596$DN>=$gm+WkX`hWBz)8^w&H^W`*co&R|JPO9T|nsbrQw;}{p zr;;RivNhqbnywKD=b_ zG?H|*HHf|BZk-=KI!v@)etL9eQ}cXnbdpp;HB4@Ro!+s^E8&CBd&~hCP1ySElGxF5 z*d@Eq%uLEc`lfs$JXABFKdf8xh@I#z?fXzjWULU=E{L=ahgRoPEthRr``j>DK*_p!C#D`#Y%MY*0Y z<_{=M*2$qjx`PUYaUk%>oQcSiEw_IfP39>I%cb;06z@<^o2+8f-Q(epzuu&VLx~nc z@ybJ$5%(_V5ewc)a=CILMOqh!h$HDuVtm=UGe5(lnWdw1lnv+<4j`ZA61$MxgnCm; ziv(RJwG#cBLM8L`dJ{av_WpeC4vjG+QM2>nr{jQ7T5TXHR}Q2*DVx)w-(d|bM;K;% zrb&yA1Js5)oofW_4b!w%(HXC}*dbYJOU6Tl2rqXefr`cml})j-^+~7G|1M`pndl|; zGtM2=O((B95y`byX-&z>hR&#*cEnh1h2(zj_=zcGr0Y%;o<;1hc0i#3#K=Xp+5T^3 zQfU<_HNV?BFfJ28RaBPgRVa%eT!Xnf=fHrVf^-0Im> z5W_3<%Ev*Z)||Hbr|t6Xq08PIJgf~LaP#gu?u8ONe{c4!OI5tuh_Sm&QY2JZMpxT( zS?Fd7Pc>}WmK>H>ozn{~v6*+EGMwxO%Z*rIgfI-aMAW9FM|qpf7x8&C^)74u9p*+J)zOD zX6acKGqbWnm&ZE;L$p_@`yCJAg?a750qgOv6PYVA+OZftvy?LUP#A91(Y0N`Njl3t zGs5omaSugGzko{1+kw1K`PJ1C(FRJVm%3BMPzSVWHn^cgOMk1wefizvv5Us1>q6Y> zd5Y`2qTuz;cs|l+Rc{6g587zL?bsz53a~ePwBLS6hGhb6@7(;$VVUWw!%BNbxlmE- zWL%C=)W!F(ya$ z-EjK-ip5Gu8kcNJ;u?NO;av3B^86X|XvG=c0zEiSBVkQep#@VJ@YpOJ(hP)Wiz1Ps z_;Sv8f%F|weKhb7*RFMm_)pjdN2<>UUAPqkTC%?2KGw%gJ$MSRq(Vz5it1hX{y1fJ zC!vU@=Py;gq7${v(yfc?3R(QO(-D1*kMb%2d_-wS!S!F3Qt#e2rXX2v>DyNA61`k_ zG7-;UfHwnOOpI&i)e!71-lZw**_mj~M`Id44T7i_E@nENTh|C#a=S(8-`=Z*N>GQU z-AM}v+g>%uu1vPJRwBIJHK%{=^ikz9m9cr0bQek2-RB|dV#?|oMYDaFod2)W!3-8k zD=_Mvy=P_5Nbks>Lx;mIBqd*(l$gpH)zoB7#If5@Do)v2JtgVXs*u4I>kEYhT@iPtfpWi8+5ZZ5IyTxeHZA;xj8V-0kA z2YTb9nKrF{SHCEP`48!g&||aY`R*^UJ}@$)`mZ~~>pw)Q=qM`wS8ZY_b_jP@IJi?6 zn;0;e%vBIK9o&e>g_AU6PrPpW`fL49$Z7D#0K#WknIg-a)aIarl0O}Z?vxVRdMZ#Q z4b)+Mg<`Z)b}KJmpc+S-IKB@ zMUjNlj7szp(uLvz_<34E_{_?utNwva!}V%Qn(u6Lmzpdtn3W|lye6@ox5DWM(`l$8 zUm9<&u4GWAr(*-{SS1H)1O4%ezlXd1+LRHEK1!Qxe=-7GB#HRFyVsE4BsZt@H52`_ zGuy5VsiY?d5>LJTc@y=YQI0GT(V|BLlIsqWithjFXM12X6770Sj&07UtNSqz|pIOys6jW8l0|M`)=T!f~d{nd4bz!`>YmA zZ+>Tcx?TaXBAdw=!#vftelW`3=KlA+RO-sJtXGqD>y{)-HAttkr=|6cZ+5X$4PNJn znBe|Yr;n1Vc*q}qP?)UMuDErV)u>pHGeuEX4yOml#9N0k7*ONq37*sF)Q0!`&?rau zFFh{2HS3;1RBf+k7*n)dD+zW2h&ROb$bIzFoO1R=qCN?jI zZ)J`zG)u#INN37cG(OuMK9wRU{~jNASPo}=xQ4BLwCR~pKW1)8F&U*blF4eht7{$q z$PBbj4$&-fYAq`DbqFmKfzGOTO|PQ)D08maOO4K0G_536L$Q0_k#u_#wXC?rJXM?( zp6hL10puv|O)AHwCd6zpFr{Q!q}7K0C)W{{e{k@vp3846N*xkdjgo?{3rhDLdBROe z&-D$51lwGO!1_UZ+D-{MHD&CSGs*Q{lisjNWPu~<$2!Y(Mgv~M8V?fLBp=6#oKli^ z^bZM}7W)bO{|blyHFT#SgJG}9uWKK=^t_R+y+;$45HUuwgDl)nMT5_uq=q$L;+H)9 z?1f5(U6f^C@BJ{V0hF#~MOgat7sS3kV!4y-bC3BsNqn%2EM`DN%aE$aR$y(z4hColMR0xJVQ6>*eO>{1W>vEj z!4tNzsq)0NG&Y+P5{yG;f$VZNrMxk{dZ9PRuJgh2Qs4QL&W{$I%k_vWGZ`uP{VEK) zaJKxkLOXPK=vj^Y-+w`s$ZF&*sFZ-Xv4-hPT1nRLtahAg`Lrzuz6#6Yzf_86R@3FK zNV1iiDVuj-gfIfRs#nmZBjNqB>^c@hkOFP8&*_yE29*2f$sqGJ;btVTn=+W9N2%hX_hCrpnOO+ZP?&& z3#ff(zPidJRSMVH1T?v@po9j4DDVBZPb`yOPJNp-C5M_aLoPQD9wdI5T`G6-^+Ni@ z9LPWqB@v&dFKo1E3iJGKMY8Pd>b6DJGa{810KlWI4i~-%(=B;jlcgu8rYhH4a7_u; z?Jcc9UN(4V|DB#+Jgn7;VnpHE0qN-jpE57~Lmz=|Hejj6XAZ97HZRZd)V?`S$CPwf zMh`>T(YRyA#L?+5<7QnOYwP|IUKc-r=4KJ!$zc>Ht>nf?zgwYkRDT0@fser&VO*C4 zal!fM$#wN#H4*ztPHl_q_w+V(DmzZ|J-k3a^-$7%2rydaQedm3rF%e?YbXyzW-}rC zbRB<}OU%m9@-RscWj0YKZ>hD&GLFsz^F5?<+hn=OfpGZOF2-of=|7 zWWv6WVABf7ve7pFT00zcbiDQb&AUiI%=pXFqvB8a8y==bo`I#1?tNzFx*_FkMhcl( zn*USA!Dr2G-YOgb1_7Q1`7cvs7UPpRQd+Y6*=_9Gcvb<8Bw-isc!-JY_{W=zQ)hrT zv+>kij8i4Z7l}2MfqiRYd<|8&-j(i8gP${3s|_B5n~Rk9e(sc3jE<8^2e|HFD%pHF z+;m&%a@#PRxVY)drqp5u+RaiJha)iFriCMriYCXAblqKLcfgl1j*K2z*poWit(XD5 z9$ZN2t&i%VxnxxQfQ$pVVX2c*EVbfY{dR4!sM~d`BRl(oz|||hcN{9$;R)fh`Yjjb zG~8dxO^}*xvRVY79ZJ5F^wL^QpeHxxMLJO4a+hu9Cg`bg^7wZQXuSZK#J4;xxvmkC z@qvm6Kh^q(@%}QoC%xsd8v+{HAr3uB9h(qD&(A%OGJ{OtVYxT(D-~laq(GMn?Y(;$ zXOji6Zod~9(Ch`TnYpdB@3}V>yGMJeNGsb*wcB0Xj63{|XYugxAYiybOKj%^Tn39S zg5yt=R6d{=-|I^$$3h%c161pCfogqKS_^duUsymJaNaos7LvQolE&a|0kG!~9WW68 z+2N6BU9!8Av%h0;|0s`aiK=)i7K?{%$ zehdL7tPr)@=^VbihEcY7o_|>sKslqUtcvRT@ExC#IgyB2C%maS5w?%H8PPptQ)h+# zq!JlVF9MHlBKh@W?xzwJ>SlzYo6KSRPE2f$jFGXikcOxdZwzEW+_#oMPpFWf*0~6*uT7r<^8R3AKAIztws^jP(3X|6*76{e zg?6&?`4`TCB28_JMi9?taQ_SG+4-n)1>%(XIGNQ}M z$@|Rn_8Q-&@s$m6P=%mmx4r95IeCmHHISM>#>&-3=$9Yl9mdi*1uB(nm(TaJfIbs2 zT_4(I=coPzlXEBRxcN56pOaeQrXR(kjnYS-K%=Qh=cw&w-JiG9h)gU;=(|#h(zMgp zL%e-+kbn~-3?Pp>Kf&wI#wqeiZFMR&w07%c?aVe~N6pVQwkgH#Qo^PAbnfivS!PVg z@zj!ElbNwZ9I zp73on#?=Ucxv-cCKf{wn%D4m-+6iKi3 zE1cc_f_tpCMLsd?ita5{rE>o+^)dE+X@n5*ydcMCvhjI*+7zbWtNt&NbYIS*l^)|8 z=F2^S>&PTBtgtE;e)k`i90Ov!@Vl{HcUWg*OjH`%a)sLMo*X-jyBA~LaH>n07yjL` zn}0q^=dy5HX%21JoEA_L1a=zpLEgSho#l;~uRpBMRPj(e+D(;yP2^j5MV>si8-=vj zzq+y#MzxfpJso+yVbe`%aS6@@#aZO$1M|FEx~~qS8ouSXWCUm* zj%bUV*pGLubZG<2gJlU%VIF`9E~uz>!bCWQJ2-owF_2dOo?90K8s zwZ(o@#b}XEuL{{OPh?zKxHf~;7y>lfer%6xdRm|kDu#Iqjiv{6W)h-zXIq}R6oFB- z=`THcmXcHXpqy$k8Aeq)9r+7zO0U>s)u6$;f5Kw{hCHWS_ZrfYcF06%wMP!ekP&w>GpemXD9087!9O-hKxW(EXz<1Fm z3ts&li-g*vYvgiAgEfusUnWyhA0Ocq`)Tvh=o`5tvAjfjR}va?eIX?D{vcm($E&|q zvmY!i_mXKT#;w)SU$>Iik$EO3Art6ZjNLn4N<~bjF>sm{jvT%@)G_~OI&+caR5@#D zS5VU#t08{fyJ%3iq;>lv!vz3#{m$bA>3`^xqx4hRvKbXWS?NE0g}$*)?vF`xl6jo! z1as*9P{O6@;lcQI7nmT5L70#vXf_kNM7r9_&CSKBT^DDai^*U-h#XW)V`nsDVO~nYAk=pMxdKp#qH6xR%6-2p*_(e|51X9MQhMLfqI8>+pb!|wn-zqU8MZd zwM>gazA^Qu=k{=6a$>?_JTb>i^~Z#TlDCEyu}kkU;up{`<`>PZJCv)fed?Z=|Ct5I z&BfS&dpUYDS6+)s!1{hhKaHWzys&+uFIaJL5UP&Bt#cLMTQ2vr7NJ>38&`dR9aotj z+3U!^=jTIJy`C%0x%6v(1GHDK$SKu}Zf5Uyyhv-;JkIV=kc9owc~}e{{n^Qgyn0^| zoJnp3>w87@`5j4$p7LLwU2P$ub>I@+X!nsA!ap0cT3=^ItpVJ(C_LK#;5-Um)pj-? z7=<`=luthFXQ@NOg~K-=CjZv0R(Ta#cyRxICCt~ubEOamTe>zLIFrUfq5N~^W2zwE z=DUxW73xajVrP5Tb}Lh-0)tO)84U6uWCc&tx*Y zk9*5T-WAq&VmZQPL_`C{Iuc(`NMs~h94@v$#xk{F?;~T=N)0|e$Og(q-S#XuQRE5M zQoVowH&MxQ4>70Nkvmbh?m4h?u8yY-2T5O_@noM`_(D-aGp!7m8o)Xn_3L@(dL(uf!4dPHzY*=S`_TD?@@aCe`C1GgEHP6v* zSQmk1ff*m~fppGLg}KZ{N1J=WMvZ~({j4`o4H)27apCuOtV2D<-lzprC(?axhVDK8E&$q7=M!jLqa2`Y?;RC(8Gs{rF!PapPaQt z2-H~=ipBQF2Us8nR&nm$Z)INv6-&RYE54|AWws@ENVWaIPxid3*C$zDf*-Rjh2Z@Dd{zi(un<37RoIxfbG=w=4q~QP{ULVEs*&Y#<8gA5lee-Oxae<-{1MR} zBj5;R4Lb-j@(5J)g&Dkvxq^AT4Tnj98-(9@SRg9= z43rr?A?X7W0a?Os+%mS}f9S;OmIhH9ta#eOvcY#>=Gi=uKDIB87qh2fZM}Ur{<}lq1ea@zx?fx=Hu@Vh5an)?nDk0wV7k#3c-4;0I|z zcpwiXqeiM_Va#qS5Hm?v!n8zS3_Or4!hgjBUPl9+W%QU6-f#yLBJ$31<9~qDTJ%Kf|C-ft*wVsYDLAke zPPGiZTUkNiH`maD1X}zg71$UmEh0@HZd!>Uv<{CWVb`0aFn)n~`!Wl6#tg#ho|0Atxx$2|R>Exv25_Q(W_6923Q6quK@{aSbs{4N z@xJ=;Ccu!yEqoz)q$6~P6l7{Z8J{B1+Z@UG+aqqvont*89m@|ZAd+YNyimL|aU1lB zpj#O9jDF7IoLJsvx$#5h7I z&hSX*xS_W^Cz0w)7G*%0PDrNoGK&Y8l{O$;_t1$4&;=h@UgEYW>@8T*$N{k$N7NjI z0pfjlQ{#&lVA@!St`F8Bg0Vyut=)AHs6A>Sz1mmFVELvc(H#2JMVfZB-gEwjo%K3& zAxYf2PZCvN*h&Q^HbpL;zxJ52K$5!Ziy&6)y(`wj3tuPZNAfZG&Jpc{F|%mO+G0>D z+>eUy38rVPUB<#mBqoC-y)5*jaZ3*Zh`k|pEZ-2TYcDY);RL+rot;heJfl0_NH_kw z63zZtZdYgebBm8-hSE<`E8;AXsS!zg_s@uw^gA#sU!WToX#BTXSYeT#tYkr=B**#~ z6;eQbQo7TS%C4hn1!P#Xw?`Xx>#<{j8rHD4mgLW{)%I{eV(HB5`LM**P&z{dqs)9< z>E1@w8R^WNg)JsetaBDS$gt!O@msk?1+~jKR(MUAb_nK`3heaokF)Ag$%(fHZluA$ zJ?C*RH-kvV@r$OVy+-IA=CYvdtK+1|6Flh(7YYy>sj;@KL^wZKu)zM&B7`nVK5;lA z8>h#trKfA}t}@?&{%f2H7Ckf8B%|vhCAiR5!Y}y(uhcAM$&OE?QoLMlU*;q42xTZl zF3`CTe<)TiE$q=hamzsn1|BZ<{v;zh($hnk<+s6o(vsu8TyOn?=fe4nXy9#EbmSu< zsEQA)fygK8Q&1^bdp8*LQPwxKO_?=$X@}DCDJD_cqMP@O&Tkogthu(rW|f0| z8G27$ck_Ez=eK~+DF+f`?Z6__T*-~_iDZ1vLci9o{9pn60Mj@C9}_dl?IN$B{qG{E z8+#xkTbsm;a?H7KMv~)vO5>mhvVLJEdN3fVH;fNMUmC}OKV%!Bl^jp7OOdC4upzl3 z=Q+$hfRbl?sTGo%eAG45Cns_NTWUHk85+@z=g6{Y7}yrc*s#k<%33b#8NR^ioPw_) zz*oCTd7WizYCq*~dKp)nfsLMxPr@D8w3_wRG9%)L0EOp=^+-6@FSW0V2AeNHE+`mQ z|1K(j!PQy#YYw`HiCwZU^;g`}l98z0aT*M#gTM^R($%(xwSySG=~$N(Uh6)yKm^v@QUE^O^9 z6J0;<59))ENrnl)9D&ND@scTSSSjp@D!BV{8Xj?GC}wt-1JU^W5Qq4Rl=b01N8%g{ ze>C+Sqv^S}Px%a(k}&)X1};KXQdq8z!bqRw?!q7S4@OS;6q8wr#~imcjT1Y2)IB2M( z2k^o90gEmq0H^`!;U6o&2OohV&>a2=No#vjF9tK#){{`0v~{Ln7$x1Dce_xVK0j{B z)sw+!8_Jfr30q#gt?pn&u3w1+n(w}R3zGkL80pd-STZ1|h6Vs`(b`66aPG7QFR_OwGk<7V+)ebs}_1@Gm_LP=4765M>9`+B7T^Es-NrF^Xp?b zH@vMgR(+JTASYJ;SBvIlU$y?ERiX0JM_VYA!960PHx-Nng%Lnd6Yq$^r71}>a(RmT zaP!3l=!@h1KR9hb#QrWlyQhD*@8aV&GNAu1$kkIaxbWJ+8G=PCuCL2>bGx!+8Y>PS1FDQ zVRsZ6pA<8~2vE@>s*R#SK0-K4qhT(d^un$l9sQ(4cf>dc9NaZhd+MYM?+lKZz`ih< zUyeFGWCzY%u65UIXna5cF))HrY*Ol=Q5ZF6+kwh_JI}-}%16A_&UT}frK=lY`ZB+2oZKSY9^Z|Gv za{)gQ`0kIO-@xR3p&`~24(abUmVh@PSQzS8XR&EcDZ*N|@&MozGayMq9hA1?3V^b; zzE(v*%$v-4k9eRVYX?L&0#QbgHYwM58;I!@+pB=O_k~me%^)`r9jxeB3O5d@{5383 z6h;gAZIyT?E8M3=#}hA587YKw+yza<#>G4XBaG|Iv@G@+5{%!N(6`m=?;Mr3r^foU zmKh%B@03}tAZZ{ygfo}`arDp6E#f6|`pu6`SioVr4=RBDf-R~7G86zC?F8XKDCY`` z1TjEZ+shy(r$8Mz>7tJJ!b?q39R54Kz>`3^g1ZX18wih)2bjUz0GRrg`l@#H)vgb42);hCPo#0DR2tzOgf~ z=J3BYIeI&KKJ_QL-)dKBFG0hcuNl$UiKn3VPKgiz$3CGTNu%!e%cv>!bl*Dn}4Z6rhQ48q*Ve-67z}}4clbI14~|}wo{pR!gYe^4B$IC3lbCngcCCc_tZ6le_Yu&8I4Ee zuY-JtsZL&rXDOJZ{t*V{U%L6QloWs}K`6OIwgvbn0HPKv);t5qOq@aWu$ac&Tb9r_ zBJ81y&O{*zOnnD!$zp`BO^5vRpx)o+CeofAEVdG~!AxT|dp}43aI9`isCE&dMQ?S) z1EPo7go+*rYZ&brNW*`hG#J)zq>pCYXNj&rJ!#N(p5d{@uuHRWm*9 zUvfJ&lYpb6{bfpAoJu>U-_%P#m}Q}o+BOzz5gQPMbk=G^VWB+;91KC3X0WPu(1YP! z=)1O5OyyYB)aAZ9K-Lm6P^-CLPy-xrkyFTiRLwu03D1>(Hd6bR`Fn-vIX{USQyfZe z|CeXMQ6b>NlRwq~C>wM+H#B9q-8Wfpi`jT42uZ@>BWa)%)-3Sqya&ER#nMFj$1r_I zf#psK(K6sWi?i4OW~ihri;dLOvHXQU<(=3IrZW2#(+QK=^+@)DQ*b?ZGnaKj+e^*alVq`px?7k1Ng9QlJ6+} z|3#b_EAX#lMwBqR|8xy+t$LiAK=b;%5R3C4Lx{0hxCzA_prj>qZ@h0$gDS?_kp#|I zmZOHuih z2?;w?=DUZFCaPz)pV01c2>xiI090}-&V>E_?q!T-Kx#&SO4nJR~p z`qa6LbdR;i_PMHjd9qVrbdzES?P(vgI+*Yk&t={+t4&oQw_zJfLz&hE_GeJU#BFAT(YIckA2lr0|($r5efwnF7$!J1~IY2(fGU-9lxvk z2Db=C&D|}lXLDkpp%U&?=Q$?oUCuB_KZ1sejSk@e0NPUGJpaN2e-!Q%(>mnzeVMsZ zFDnK@vSa?e;R5LE)KQHrb<9Eqq)ip!rktqDh*-bIbj$!|eR?Jao z9p(ExtZEVP-fF_{w2~`xD@|p;^WS`GtPjX|6^qgHDn(M3mUNYdZQrs<(|>m<;J^Rt zfL|z1F5(wSLWuKcyTyoFA$f&uz}s3+^POc=vy-cEW%WgHqt2ajqPO__z>NG=c&K_I zR3jA0Dci%)Dkp|uVJaI`$s!*;UXP&s_PU;7Z+7{^f{$@sZm>E2;_@rKSxE&lk-#4#j5`K6q~(Cc=_Ekovi!#(CIldqf}f zT}n~vI@8mT!2RSxA(UL?m)x~)ET2F>`r-F+u)5f@QpDy!f;77g*fKJ!kpMuJ2pVAp zI%l8qTs+GSxG~_o>Xo@&kJvFQ1pLCDyqn63K{`hxmeT6z6vM&K;?e^Rf%3=B(Gdv#pd`C+QnfR>A9lqt?G`g zStm*jqYD8V!>7iOhVpeey2Q32@fRwg&>Mu; zZw7$pyOhhsKK~`;Cqsxxl!&;0qgXM&A#N-D|Mox?oHwm-(*T$wnEO2 ze|4ntI;Yi+SNTvJ@wyPrS3ZU4@_dWi+G=lhKV=ENI*yES+7++x8qI5XQU7KC&rp)v zFq;>R{^`XL5~s^4Gt?eYC#8r}>67(`Qu*i9Ijy z)$({YDa@GFZMa2~raWuBE-7yB--!iblbcMHLk80Xx~y4fC^cDLBCc2Ox2BKwe+PEd zRXyCC<~o%MrtvYnE(xud7Zml78;uZQr z80Nb1C7nfO_3m#h^LOejyfJ0{l@Yw%Y=3KRnQvZ*_N97TTwQ>%ZoP>bvMC$52h+ZOtZ)fd6(Tt)VLX!$Q||EM0syl&AbT z4a`lekWS*b+52nX(64*>)Ko0KU?`E-%^XY>4!napRx%Zfcid{ST-2b2-HhV6)sKdP zNzZJxsfnonfGWNQ8#H^$gUB+FZg$D$a)g@57*EQ`eIj1jp0jy9N?fAFF^`g`*Z*{S zA)>sL!r@A!j_&+?M40&4{tbMhNtdk}#pwlx#eFF!G0j%W5&Tf~HUC@(td`3Chf)1< zt;F+{goOy;-GvXc>opEtgY#Ar44f_()}YROl|<_(J8wmb{RiMb-IY(upWMb&IcDyJ znZJQ&4@+&GU;ZR~s`CrD`?W{m2YVf zthh4Yx6AXn`<Jm9tJQUhi7$WtDVF))copC!~8lKG+!%wU!Qsz0Cw5+wVcTw%B_a_hJKlyyUjWCLs zk<_#w@5%$r*8#eIHw>|prj`7tM2tInqroY$2??_8k&5zRB^I*Q$Rlcd2a&UCi0 zp4#R*MxRt={#xg_m~Q?}n;n3}l?C7`DkJSN4?-qQ(|#T+*MTkeCR!B<=p~E$M{XvyjK}48yGM`96pMq5 z-Ru9=%|qF5Gi2Iw!Wa~NWDtNml#pkhZ&31AlHKKW;gcqm;_!qlNihIy)+Q)uE`tWJ z^2Y-!o8y1>F#R~n-3cYd{8A6~$T8(DzUuS+gNW&fhH}^i$sz~+q4@|}_snA1c~7pH zRl9e%IwSe9DL<6pU(~Utw$t8=hgp$ zR3U=pQjChnqj%sN5S5^DRF4PHD9N zxLr?A2nAB7qwZ|1>LyWcgX zY@)-}H@YsbV?+c0F4Usv!@_&VUB~Oa#M8P&?acWslWK=k=%bd*IX1vStehy~_ecN@ zZT9Fd^D7>rN6IL{RQ3d>c&EcFPNwpK3A^9o-Y-U+a_)bol58Qv?I^~mm?vxtb2>e* zHYqw8OB`n7v0st;=`P%ph6D3c*r#X5SF6pI>G|%4q4g>&ljmW0#gC}I_xXN{GI=B; ze2%nBqOJ02<|O-%+R(f!tLy(^f*lZ%tcV`hnR8!7FJ(yjqNW~nnbfp zvc>A%ldR=b4mYHGRKgHja)`$9_bS7_6-Y+xX#(Xz=9V=2#_-sv`ubC_f@qKV@vLH| z_=Bs|B(~YiU9CY&xro6}dC9-~Q+gGS*#d?iW@C<~_64_*&klgI`-e2~RavwU;!nOI zENy=?u%^1dz||AGi`_J4RiS*8PY$jIF%G+Getdkjzrqe7fy3erv+{J4|>t?t5qp|G8`jLqyUVyu*qOl@H zpDim-kNb-LX()t1_%k=~{%@2_{;SQIoAuArJR*6L9k1zBYxs%oo4(g=n{|f{HM>%2 zT`hZ05SR`J5n>9}hi!^h#LzWA=U?fV0Y~>TPwHnN***#&l$K0UUfaebRy%t^QbDK?gD< zH%thnj%4Hs5L4U7sc0}LIoz2;Youd*pjufxgm^D6<_sOjAe8OW9-Zv-4TI*xC zbne14Kj-DcE(Y%f+;{MgmOHp?{eIVez8VL%eC2qP+MrX#i3=ffj(dh{Q%zlOy8!`S zT)aV+hP}YS#_W;jmEsSzzFm>7Z0BaG8uXvH<-rS z-c2Yw&+tVZXmqc^(Vh)Ys(;LWyz|>?Iht1h&2Nbo(+VmwN^5@+f4nAp#IkriKGQ=ltSv=lVaFW~rc^FugotFZ ztYBs}VvF_scjG;}4qYMN_<*-2PFYLiV>S-wCu}z8Y;~GclJe`1r!=#u^7J_7YCAfd zQHLZVzNFNqorRdrm_15y$(mg4h#!~@pK+Z4qpyJsg_prk%#ST8FLx+Zudcf1egsq- zVvz7jhFzTP2A(Q`^@YJnthRoCj<+JR=k7N0J^@dK|BSxKvZv=lX9cICOW+5DBnw-w%RvRxk`*oBU0I~yJLgVYhJe(Snjw!1+%(i?m` zu{BdPu4cxuB=0uXNMmXJKg>8RY0Sp0w-ZKoy|jmt@LfvL=Vbu{Ve)qY+2arUTwm(L zr>$^0Rk(H=i0eaZMM{;FvfkM(JQh56x&={=B7*Xob*()q z#~vyqK6Qi#ypg=C_R~)U>5?=vmS1zX&eHtmj2+pHT_ZIZ6ilu<3IX0R&M?S?9)BMa zhvl**oz2u57IRXneo8owqbsO|g&-Xu&WiMeM?K8o-5ky{_3cq~RNu5+{yb?{n#V(0 zaMGI1zB!#FLdL!~?$%8BZ4CyVn+} zSVLDmQO+~Kl+A|6_o0KxWoV8 z-5KLTYEgH)kRj2+w%+0jxAZWtc8l_cIjHNoy}-J<4#>ncsQ1^OJY|f5bhp~&*k0Y8 zdGno*RYYQRsE0qNZ-2GxnB?tPrXV(sG@9D3Tt<*hBb8iZ=E3?{iaZ2Cm0mec9IRQX z_e{&AO4jK^^O*8mA`H7sU0H)Qt85JC54X(_BDG@XHVxLXp8Hb|6W>Io6`GIxHmH-& z?@thcpqEDugSX?7c3%|?-biLBggATtX9#PE<2CK&gV)L@c~TMiEX@iHarNa+v-Q%C zDSGwLFfFGKAlgvIkcX5Um9#IUoFCs9U_;`V-D!s*6}s3)885X2vpd20muCeHnmBx6NNnWw@iNcs0sVZH{)eA4R{1MdcXOk}9=999 zD#Z%;Zk>NAx>#emnBB;Q%4#9(Ko%*Bt|^-@MkXW%K^fCt0A9>~eE(%`UA zinNN`Vt%FdF>qag7H!ANBwETBIGxY=2l0zTrF$U^1B&{A3|xndhjyD2Q>+!|2& zpOWaTt8DfU33Ce?Lp@bBR+s6MooQwE<`5l|%JA|}6INFoftxPF znTP-74s|mpoj1=Rx8-_fiOiV_75b}rJl36m1}1^2gUu;%vRkKV(+5&8xEJ$gUjZ`k4K{DEkVaDx+>u z0}+)H6cnVTTM(p??hfhh5|HjL3E|M)-Q9|WbayG;C|w8MK7juBzI*4*yqPmN?(h3{ zthM&)z1KvB6N8s>uVB{ceWPDMmUQffMIg7l`T zMqNF5?#dmss%?xDuDymnhfFVW*?Ttcn`1q~t);N_xOmar=PVwIli!lpGB z*t_vS%OUqe5dmR_UgJgX{(U)@nuh!P+a4S_vn3B)&wkY?pRRT;c6`7qk>mIi5gv&X zKTa;qX|b%3@Xl7q<-EKX#wZVwhTyf@8QXP-WQ zs;&PLv69C+|9Q8;k16rI;irrP;%udj%hGuTLSQ6Cwyor|Qanp?&Pm~+2$(a1Imk-# ztRqk7I&LBPDb`BKm!Yh`3G&=!wE4*xRdR7%80p9Dx}!ElXnoU1B&#FZW#KZ)LaO+6 zc0TUz;im2QG2h5y;C~d*8&CAx7j-YTNGmx;(?zFvy8JZs_wH0HBQ7iu5=yT1B+0-| zOX9uxx0H(1P6f>6y%u@&<~L!{zY>^f93C;|E$_IpJBZDq5;grM2@MN!zQ6zlu+tUl z496=-m|XUGW60d()pEaRr5@@FOPgmX7H~!VMN+qc+eX9ak0a@w=(tWBBJ&yhuxO`D zh`CU*M9zoGsJv6Rvjd|Ec$vKefj3LQ8AQL6-}K>G$$bkwKuE0}p=-q=>IrGiYoOkW z;_G@x78b=hNz3yUBsr>BQ9WSIsVd-yBbDp&<^(%Q5E>0FZ7AEEMdSTGVv7x<5C>Na zUHdvpTTB}xwkcpp!VI#loY+WHy&z<6*lXi_jJ^yEHaST5>}<0g=G!ipys41*Dg=v$ zQ;f^YO|+@=^Y>Ni(PmRuXNz``9^siMU2-|Tz*f~h8rS(CyVK(LHPABC#!+9nP9nc| zuyUB9rC?95fAo|un%rWlu3XtkUHzRc?%uLX{}H|^f@+9QeiebMC)^9J20WQe2`|-C zPX3^?$dT}Pi>5;+W#)o3TT2&OS^dhsi}qPk%iSHE3eyh{j5H*(yHuAlC6rwFZ4C>h zE_4pjoa#QU)4L2I6ezzD46snr`%(KTtAOOSo(&P+pYz*?p>kP5T4a?oNt29aHy^jpL20 zAz3kCFK3KAT1~!NzQBXTRqxOAq=r1EMTXmxd}bUuTF0)k$aLQWndazdRs$OK&@e%i z(X+EX?YdWGgh5nlESe{;GhCqJriiLpW94`Q0b156k}|KYAkJyif@H)l~tt?c^t^=jE2CPfrz z5t>aCb>|+sO{$MV<`J8U%4GK@CK0b)fPq%Ie}YW|-sMxNkuIZZ9B!sDRfT8%7LbU$ zKe;X2Bt#SQRyb1XU}Hj#WBp6`!^uxVp*Kug`@2+^90;Hk)%n+4WEK1%EX8yc7BO<$ z6ew{F_z>0XeDd?|LR;unOL)RiG?fAQGxi z%>-^@2UEh1g;ixWm=I#WV`kix$nPMgW_!71bU0)?G#IIeM&Yl{sFA^&$DqotUV(#8Gx+WL+AUrnP4*gR8?v z$?7o5s1EJdd5fNpVEuUSLv1W6Ha94&b>{~wGT>Y5!D*^<5B!Y-YO?#2;#}8RCxzw4 zs%@jhS;qTl)z6*)V?8GAmHXIcWPUO_4p&;$ng}fHtWu+rEF1$v(dMGT(SrItWeclc z{7Lc(ogZmg`VWe(JD#cCH-&Mi28Sf%<2W<|HNGv(Het9D= z{n}3r5u|z(qU6K!pqBrhzrJxFyEG)8=mW4G8>J!L3H;82ReT8u>XcM!)po1;73Okp zsU{LkmPKnt=FJOR)VDqX`{Ls0vvM0zmEScNZjDNw?Ys73nkS8Gaq6Q39g+22q}mGs z;FtX_wfQCt=K2n_inWsyZB^1+XH^>eQ$=MNO;xLm-0y!w+@Cc~GwH8E7_Nv^F-irK z`P|voWNN^#zv($xA_1G85(Ik%5gSSOIs(UJl}RHz2z;lim@`LPt;4V{k}UO(l|ZDu z`#W$u0H5Ywes*EywP#XtpLzNO#-!qVtx3u|WMOaXdT?7af--I6pSzwRRl+>p;=gFR zUufL~_$(pseT|pFaojN80`|{?un)Qhd8WyMQ{(=1@AUhd(DUQ4cb4HXiKf5GZ(=Yl zMb<&<*9zW)W+>}h5rDX9TH6LQ0oZJ6u07Nyu8mHsOrQY0-;?G4H6Ti9dj7(DYQ?i`~s$5t)L4iSO!wR zqBvRAq#Sz>l!7O1_;OiDCV9EpA7p><^X{DEIfoqCA9|8rc=9+qMKoy7D9vHHquD4)L2$xZ}~>uq+h^iMD57H_JL^q zBt!cqH4rTvi-I8=xc7P>^?v#Fj-xP-`uNV>$v#(TTxJZb>x*^?HUEQ`a{_-FcC{CJ z^nN53<74#3-kWqbZ26oC3$lUOs+T}7n|Huot8jRl$>!OI>U}oiqW)wy^rPKGl`&X2 z9ryy_<0{tt;U1y46gzAE$l`warpYUWdLu=_#jRp}MzH>yxuMZDp_p?UuhYQvoa%~r z4ub}D7@=5mF8$a6MgMkii*`2TuX9S?qFkJI>>ADkg=UM>!^v*oTz*F%ZQp#Im*)I&d z93Xw6ia)MmeV}$+Q!hn#h?uBZZ=U@1!J$pBA41#vS&h`YFi1yZ3D zBf)`qW>0x$;NXAG#%semeQi;GYB7vAzvkz`-M#c*a$tOg<${-TMiPib=;y;%?_s+_ zRdVBKxBL2otzE5g{p-Xm6V*xO`yT#aAF1AFWGY31MNeyG{$Gh%BuDRH(oFnSmysc; zSy}Wlk{s)rz~WofqUc+$`=?qY^Fq8%Rl)bOU!;SDrDPk_xg9MM*jBe1;rJj^JGh80vxO!=yj3L`bScXwecm#N0QPzjZLdP z*Yz;3OKQSua1zonjf;V@nG6(6uVM8xVZYzD0O51EcX#4JSo?gU%;2^i|86``N2+6a z#Tjt|tRTUK8-mxzLm z4Ey0T0W9k9hORaRg4%+M*F`>W9x;MlKaLRCs|qXa`Q}a1O-JDG&qDA?D{y)Ji-`d9Vu5Nu%m=x-Kl%Hv3xC3f`HBkG=&O0u z^&WINw4K2C7hc?AK$>@WV}WA{04z_4tFCL*-i&nT*)rmNJ6QQxOr@ji^0C)TWCLAQ zS?3y&@JX9vDGpqhV7`WAIgotJ^?n5=Al<>nMX>uH=n=uv%;`STVu9qqpoHFBSmD>} zUu(!6euu4-KU+Dl0-3D0umbbtCIWB_PMPS@1B1~JEnZiey@t%32%uIKj@?TKSx9{{ zz2FTF!QT>Cf!6qUL*Bz+7OAp^Xn&XJ&H_4*AEvb}2~3+oR$qGcZx}>aU0wwJ;#b~j zGnBJ^!k|Ll?Yuy}S_iS5Kd-0(3M!?vvHyV{?G7lRNcRyFjAi#lulW}3-1n+r!A-X4 zIDMXH%UPBWkp6*@jt#t8?)0PX2q;10b`=SKDdMXpSQ`BO-*z45U>Fy^k=x*oNMsK4? zlxo@HFMfv;Hzx+{zQn)lbcZ7(1~B_N5YK&`qV71X=l1XODp(L+wA#^Grq8q%mMY7! zgN*fW2WY}}rv7o*+ih$8?uYj^scYZ52<88WtY9DC+0uGXEyBs05Dt&17f68X#~x5# zvYSOA?i+<7687$wtn3Rt_otS>x8mclN5$;`(g5~a=nvhlf!OU+y2d$*3Yu9 zI3E{or%O0}OZuA&0M5m$68@xc`xBV}f`e%KOxMMpVKj&!2&muvBcSj*Wg)yk4@ZcA zou9a&T0>Zw_(!r^Sm2;|Nb;b8ECgFTVe#K%DF`;|eJ};?F-rt+>_@8%cI@ZoCk_Dd zRx3~qNb`w53}>c+R_OuOu$t62zd)<|+P7xYd+8z~FM3MsP3)hl}m6|L)lIE;g zMP2Gkeloft7c_LTZ$O)35>)h|+Kw7`#?76J_A&q*P$0P2U2G4=UOx@R<>V$5oJ=Gu082QVN@McYON4IRh31&*wqPcly=*{ug3F3`WB_{H~XCjn90Ly zQ#sQ(2N8%tZ!D7Qp^3JA^HVaJG`g&iMBjabew{AQPBOJ7Mw%<@m(xt9ypvta16i)v zht=(cSgF$a?GsNcaDr8seM3W0?nOP&{usK7Enl@ch)m5^#cgP47(*tx?}#-TTA{&i zLNAecA)FY!aySAcG?TKeae!Ftd`AEg=|HhH*M-A6?E&r>_F?=euWsz&k0}n9J;osi z2$}3X^rkp}LgJtlq0W}B_T;9kmnvgs0-^6Y2)DUdHDn-yg8puxGW89X24Es-j*n=) zKO(I`zY#01XG#CJ_~&E}WXwLbuN9@kPd|MmDpIQrNiuWPoXpajz^%B?K-wb}y9@L4 z%ok7A!V99{@^`ZqmM|JV0wHW)bu*__%S{q8jl&>1Y1}4gXonl$??cTK5)p5DuXeK3 z=EENfGj*2eHr?ajmrf(X2z21(cVyCCkt#N3HXdkmxm?L+Y{ylYqb;+KQ6ag1rgZ5D zKz}Gxw=ZzUJdkCw`NAPOja^{E{vV^}rh+lPdr4!mz4%=ZgJ1ePKiL2EXR#wkwc-s) zZ}Mlp0O!be$P>@q-7e1_CdS$F{M_Nb_;Ze@)qHil>t?yxPOW?Oj%{bYKJ=H1Aim(v zE7a0mDvhV5J6nQ$rLPDtDKYasjYP9jbz{*)$g(Bkv2dJhq};e1*IvNeVEZGTGvTLN zw9rAMD^(hG-eM`3d;eJZg8$x`c&Qp^G7y*@DLkox9~!j2P~-=6zL&;DH)i+y%Svv= zyX0bR62|gdk@42O-tMr4%4Y}~PjJ=6K(tRn3+Hl`GP+o^C#4jCp2M^XDsbeKNruvd z@!6O-KV7REUMu$ZQ>cLUWP=_ps%RofW!FTIS|3rK?cMtEugwDGLaPKCFR&C%(%_o? z_b%1obEZx}=CRSiKu|BxEWCqB|Iv1Dbk#|t35u{*m@}Yw2=?^xw0U_ zk}*R)IKl|^9{0r1p?Au@_R_fD3?hJ%$(%lJz54bHQ0y0P&E!6a+x0VXe4%us88K7F zl)-b|T%o>zuFn6E#qWReBHcKe!@!pBaCsqp22Tr`cX+b%+p;wXPx4TyP(r?N#~~No zG52}!58q!N;_(8gIiUpa6eac{WYMFFeC#Hj5Dj*>r`uRn-^+TtKOP^=(n-_M+GmMJ zW8gU2e63|zm1>kjI>4Hd4cPQwrj+sGG&*_Rlib9uSD_(!Tt^Z8r7Tk1BfdoQ?B1wb znQkXt#<lZ{H_Ckk30)=>E%1^y}Xt&}qQ1uy z&?dJZfH{$~BnkdyXQ;A(N7ECpwm2lAEjw`a2JOjrH^1&m+zb*GuVrAPAtrsxnIAAN z)95R_Pm+iAu`>>j%j(|c+lx`t%$baE4PvUeT7)2Gs`juX-Vs)C*fNVY(f8~*R!%hA zcRa#@au#iBR7;>u}L+iNjDCQ_TuRt+3O+O05sA-D_kXOUFrO92iqfxg|VFW zGn$9s%5;>#y_oPthkr7Y9*9$1Su2`^)ko4ho(@{#nFo9#q8T)77X;W(gsJNw#X<__ zm(X*egm;!=zEZToT?8(T8v|1`0s?&2X#BNoIc1Xn(4q+QxZ!ga5OyJPYXuO1dgZ@J zu!L{nQ3X=~+}X&xklYIvQJ*cdw&*JUn?@YitR^kb>VX@jbkX2o^4YQg`l|iE$AEFS zy2}HHrg4YbH;T$FNn9@Jcm$uT$w=gdEY4=mPr z$QsBn2d{pABhu}<;HPf7f`}aRmEBgKbb3BpG^GF!hdXQ&36%=;Ew$({QZmB~yWN z=;pZRV5J5o=!y-Z0u;0^IWbN3y%2XMKELk2X-9!uome)O7I?E02{<^L3M zZ3*`@_LVKhap!LZeXyQO=cgtsGpjP)-C#~D&iihzl>Iykp89>+Qs+Rv z87-svET7riEBW2x6763i73*X08gev#fQ6=rWxgSkFM1Z$qZH`ngxn-WK^XtrR2AL( z&>7m73*{2W(xF>j0?^YHLUm8*-xJ%G0_dFkFl{J2@F1(a%MshAA=D|xtK zY9*_Ovpln-zty^i2uD_Md=X!TE;yEH&RHR>7pGUAxP@oX0d+d2Z`egx`jL455W1bo$I zs`!u?rUK+N(Ft{mET=`%8(r$kvl3}wDVV8r?mfTHdH+9p{LfLC9`BFZ$agw=Rg|V% zBr|b5%sf%Uig3I$%iE!j^YJvf`vrp`Rn0y-&$iR(&?XiOPYPSVq>lDb3XeoYkUB+ z9^kyy(^N%79V>PM!1))c!vP(G&-__bvH15+)+0#Q=u7;jnq1qxV}+6kWAna8iPg$} z?FuBix;UgAYCgTaUjM1eBwanyXgI1imU0Tfj_)D8}yX zU$Nn3lHpBWIjjfmvv)R)7Y}fklVN%^Id)?8sBmD0CbPGfXZL?R%O3ub$W@&eVAm(S zl`EYGFCdQX^9pa(o$hRZA=y0?WzLc9`;!*7H`0A#wRiFEApbL>P^s?*?ioI9Yw`f= zp|aGk)0^ZrnDj^3tymw*vqH*UE>h2fcSPC=ATf(0lcwpu4B*DRtMU^nSz-?*lRHeu493HvkgXVz98b2lNv|D#fqv^v)I zRP~dcnI^BSw-IxDJ(B8lN{9Vo4qJ-}95==n_}iKQ^sb&sBTiXK zX_~jQuF2=AvdMipQiTm=@8L?^klYT-AsKRe`5CSIU4@iSYuHiomM;-pk&N@2y922S zM-u%S{3mPV)1$i-;Xh&Lv{peXdy?1%8^hMO+;-wvek4#cWVF5}`-o1`pL_u7kCjp# z?#j$l3q~qOT5b*4vR;zq-QR zL?H1u;r8Tb*T}olu~xr9ALi*RcPa7-H5)Vc0r&Z@Z(a|{CpnrA=uMz!uzp_w*c11<#LNU}#A=9Y;~!UOWunLsX};Ea2%lA2?Zo_SBU3 zuR4}O3VbIVMgoJ;Pl45IWZw&P5cNf43CJz;6XS(hrHa6?y`$6tbQc@%&Z2)Zg%M~r zUv_ za|L>Yu~G|=+a1UukNUIzn{#ObpuF}ja#cK8^!A3eL62AZYDhx`f8*VEvz(yY>8I9r z{({c~0mh{e9+d~}6=GLu>o!aO&>-X5!|ckA!YvrhiJE$8eNpmfqEfF~8MEQ)hwG0h z2JADtmnpW-dLwBu^=Xn*%a$2P`&wp-SJQ-Y35^#CCua;>N*=)^-JWY4X0}99O9Hty zz2g+wYl-j|*4cgE{gk-4{|vQ_IxcxRAu1#pj;G@&+nRcKIicj4I!^;Jjuu*WKX+@1 z#dLx0wd9wXLUoYVN2zZ6&z*@1^Qql$Y3WIGJ|3H0Tbh4auGrV!$YwWKsmBbVQbCJY z5tplX>FP@kR%U7)^b-7YxRyInWq3Zth2# zZn^}9K5-WjE^j-^``EzbbgMy%yjDG_&~Jw0jnqfx^FcBi&b}75&RztI@QZs~(e(NQ zA52lEaL4$8D3qFSPNJ}^bv%7MWor^dI2q*o$jz?)^Yt}%Tz|I&Hy=#;w0bM?pOzc+ z56l#^upX{^vp?7)LyN!1Oz=?&A3hkzJCL73tFxW>~!!v|YNhMw-oGv52X^MDCE}IRKOfmb^xdZxx^0yo!7vx9Z5oI9?4)zCXf9xl) zKU;d_h`8nPj9gapMy9>QVzh97vPzRPgmGmnUaB)JL4}YIT4T9bH>>k(*<7&a?!WCF zL(a?z-$T*m)B5=j!$-~j_hK4v#3R$>$fe~+A$Hs24}i@5exx(~+p%t(-eicXKnX3S z)ovjpK;GA7&$H8>2#QUCJ!fEV0V!6-ZN4~pVjP|C6%1SivQc6{Z!XW{N@lb`<1CiK z>NRHiep-$x$7Q50>E$sCPiR(Gu{Mx@zb}!+ZzIz<2a`X(!U#>_F_9jlET$xXZW%F> zB`$w0K@1DRKk&W-u~TeRWPOZff>0hh%M(7Tq((lyx=hAQ<86wy6Fou1El#1rGD5-O zDsfBAMa2U;V;) z6>2xqoh*p_>Ko)ig#6e!kcU4tzH3xQ?!}0>MwS?^5EjhTp|R{cdskA9X%GGG{BYIF znjsR=b;sf^ENHNT|6h!{_ICGJ{?pEM(l76f!ofM(OzY?c%O5%?)lM{!W#XQbM+^DU zY|Fm23x+AkvcCcXGRSqA-wpL#kUeP5`${?OpSX|F>^e={-cW_D5`TKfY)P6*wL53PF#GRH&<33k3En zR++y2){kcUqa-sYx!^NkwdEX+q_dKB9cJ`3{iE#)5dInGA&)XE!0&?H95C~8|L0mQ zkx(3{GR@HBv`XW8K5qduGdrr>7jAX_dp-=9TEC_qJX>yGT=oCAl;Ue(*w@HHER>p` zb4(w|m9K%^Ze!-6%r_Hk%)30%D{3RVPAHqfj+Zunw$>RCcbV_q+IAl=w;U?f?Qe~{ zN)m@6=UO`JQ^Xm>rhq@++jYjHW;gh|FNw|x43ZLRF8cLMr%S+{sLbs^L|7gju&^V4 zsq7<7Rb94v!ETNko-Kr|wDNJKRVn8DQ1uzPJf9iD!TTtbkyA>{BA%74So*vxGE?@F z_miwO9h!Ri1(xc$`oxut+9!*l^H=^uN&Mv)MAL#wgV{P7m1C!#l~2OR_s=&zktV;1 z?D{#EST7VtN5BC17rWm-Ui&c^Aj_mddt^%OuWVBakh0Vr#=87aVNL*3`;f(1^X9Wf z648KrnY*%X^w)e9xp8D6RP|#&Zgy2^GLtQUK+6UC2N_#sZ3BTbU^SI-qSAV?-}bSaH!mO?!uw|R(F@$X_PPM|3nChuU1zemuZ9FD44vu z;^$&MuXPx8X?%S69G68gIFE7cbLMd58+nm)jNU+6`H|_x`7v~*WT{AP`E)nC?XnjP zAJJ2;aJr&}rp3p&dW+6S0T$*ztEE$q2Cj^%`Cd}3rcm`xoasFXBPU+jqClDsqETjHOdV`JRIUoDJf6w`VVh3 zTb&yAxOtf<587*?lrbBXXZk_Er9cDJ>?G#l!W1QvO>is3}Lrz*9ilbU4Wz^W5nv;CGt~m8niPR%Bk{TLF zekeD&fpa#=KeDix%2Z&YpFIG;MM|hNE1k7vOu0r!}4v{~bES*ky@T&s(MAyq(^q?=<%PLQ-?x^*(!(dv{`)7Eh2(O#5|@_JBz zQ;A!VTzPmJjrvHKB`-*o_FGL-xgjri_v3rsR=b7TE?KgvGs6T7qUQS55pxj-b)1)$ z7bvl`-dUo_eVa}3cTAfMjY5V=C8sA%hIcY^L~W~BEI()$Prn&YV6hhH3@5JNwgJa; z26H2_P3w(@vTC*1TGuSw%edMJgoj>>#2q*$s~~wtKXg#jmf*VuD&8a1E*Ch5di@0C zW!D!xLbIMyxH8N7B{#GW=M6|7MGqfxes|KZ8vKJAk#$RBUn%eM)GCTuvIR)tGIP0U zh?5;xzdPo=?Utt&F9|%y3v;o5!c&VvZ}j*Ehj0yO_z6sW7MQET*{>4$IZqzGV^z9OajJ(MUSYHHFi&x zmC6iCHDnqmwb~uFp9E_UxvKUNLpu0FO`cwJ8E$+gun8t|+J0k!O|UASfWmcD;=&?T z)KF_anU9BZl~Hv#ZT!pkLG{e!(mbZq+-IYs^SQH51@Yu}yb**XQ<%_`g_=+6;Z}NG zg=P<{DU|kftC5yhG6m;$5*C7*o_4vU3Sr-}2vqdDJPu+N+73k#sqAXLpOi~K`fOC^ zSZFA5>94&IKh?~05r?h`r+=Eif1GC#YRI;;T>}3E#cf!V!5U-86CajzuJm%u45WyNc1w zteZjG8lbr-aHdv3h1q=goM>(sF!QQ!)7CLA9VU^vg$DZ^`HsCC#?x75j&?s@)a$l2 zi~zUbS)Du?bGPIMBtKuGQGL|<^vf6~#@}3kWLc;P(!u5zjY{2N?ZlHsZ{x@!GYy`R z3W4(YDvPM1hOxT%xffF^{Y}3MHWUkr+51eB&!;JM8|0av*0H*7p`73S z-ZK~af^O)j^VRYbIjLEF8@V*qN5MEu3e7kiSpmQBjJEeG9V?YcpVKO;9>$GT0wZg( zW)(eCIC>?E|24$v%G8V@HKQuRlgOv;@ z(`Sym%yqjSPBuq9O6OI5{y+RTql#lR8+A63_4;Ggw1itKERH!V3+MZM=VVDGW|<)I zcO_r!e<@OJN}CEcA)k++RrXp|iQe?%_1li;co>YElQ?ZVSK+eHlP2OrX>t^(bhbUN zV=R~Xh27$mk(T!j!!$KpwVYQV(pybkH@0;1s0KM|h2AEQgN|L-fwgbD6T~c!&|VLe zrgzA_R+KKhF!edwp30{G-flcMg>YWa?9^l<8x2zO(10Mn_$SC~%I~CJ^a)sUe%DC7 zh$d>D_zmrCx?j~_jAE}=%$P&IZ@sTK@cZpA<_2}wNzY|lfm!PqJ=!_nz2c^cbS~O6OmX8`(}1H_uj2(^f}( zWVZ^cPVM@Y&oo@m+WLI2&glrQR`J}%D!a{k-bBaO##BenZGjj{Uno1$Eq~=k1cHMe zE~t0?5^;HbD0{dq2(!|u!@RO!Sfo6vUnUUJIa)uA9mj4lgtXZy+WbL47E^qb!NF>+ zCzrwYXlh!@d@NGYsW$HNY`@_wc#YJ0mt-{l10jQ#3;9O4`DhaZp}%Ko8Jg^zk(T{XaK;jHtq%ti9@Tw14F^Zh@}L^q)f)C{_1fD= zsTcY*ELK-nGD#+zB4nYxvVCv=au!U$SyT@i8piNaX9~zI;K0kcVcZ?urbsOylfuzaS_^WY@LskwUYBTp;_z0c~7 zwP9JGlhbO4TizNhn~stx?PsOVY~349vEmh1W8_yV(;G~y4LY!G{-u0)Dq{Ab@!JlD z&Y9D=nq4mcb`-M>0mSL_jy2ZpPI*VeO=g$y!HN*#bVM#0{+h}W!?{1&X$zB?LooL- zD9gjc#pq zh%Pu=a-lc6Adf}=(Ho;cBc)XwCob@33; zS4Io;t*24;ziD0c93QTshpJago>rch8}uge{~9LR^1Ej}6S0Mh-BQjGA)X~Ueq?vt zH_L284{e4t)X!S@$ z64rdXL7oA1dDE2h=@1nQeSO&sMM=BwrtNn8rQ?~d{&8<}woqitCUm6tbJMzY*|W~A zXjTiGnJynG-1tB%q`zE784P7I7+#`d;J#6^?_JL%9JLGTzV%%N zh*r-^Y;muMWwnL({z+{7(;Vm6Cgk?gP(iDlMJ*5thx1 z@u7mZT1+!oGgJV_ikT4Nr`q|F?sm1U3hq+4DlA3y5rF?m@Lb^Dc7uA7d?z(Q@EbYM zd}PZif^H%Ao|Kymr7j%4#~oq$uIyu0&)aqnK>jEPk87*lyseJMLXwDXP~e^n*p(|h zO6v5}F5a98#OJrYFOYBpgyAX91I+ggd)#({U{B6Xc8nG{tW5xg9~nxF%)ryX?Vmtx{S6YH;oS+nK`! z+(~5@di>J;J6N!$^cvdV_AJm&w~2<>NCcd>)6d5YLdmNJ@F)txcvu znJbinNrG@@CnK|g|H7}>uS7ydT7y}{>Fu@=v{{AfV8vpM1 z!RQaAjLQM`T9+Lfa<^G&NN0gx5^v1_`hFi_^iAl~j>4e(zVVqrD}d$7xn z`#{L{nsO1q9&`|jjQ<7?SQ`7CKyJ+2c1GA7OuPiWzWe?yT1?kFNUG2C-*C` z3d^sHGB?9|!icCKQcu-`0!(tGYk>BqeL)(uhn~!^z6LNLP_l&&zJ|fqZSY@q0)!Jq z08$N$9p4))QGz~;$j}oJ3Bl;7&m&TA@c$ELLKVL@dU$siyfDXNiE%@V1jMM1QyXeB zJ_>IWyHIta2Vx0fQRn(*$P>uhz;8<4P2zGhw!WQ+Dg}6V2D0Lr(H-6=DnhzmlR+mO z@S51xXnU>73C{jy?u912(KvhgGP~P*Wli5(>N0)6Lk)4#r#u(Yrgkt* z#wrRbywk5?x?F>Ny^}ofF%c@IlB91I@%*4EmQ9#?^ovq6|Fn1GjII1xayY3bn^4E?hQL>cGbOXos81PZb~9)fXj^hF z#$MqohST1#=p%(V@o%08pGS?Joaf#vHoD46?NZQ3#)G`VT!p^@NsS;tXOi+{5?Ys< zLdliQIQkEcM$(x2@{j|pn|+@R5Gc{fIzj_HMIRo@DR{(QvMI8A z1CIYbreAN{+c5MVmk)?>H^Shn9@u%&&p%7y#yr@U2Mc+q@3Q{Fg+=2bSPe=b z5Blvw#b68deA;zCUsD1s)IoDJcJ7wgD}dNG(!#5jBs-=zd=+QS3I<)2dPT#3&9MJ7 z=!*yYim*Wi8rL8EFN3zHvABUj9jF3ZiT|%b7ppb@JO|+Wqhhxca!BVn)TxK{^ zXF5{o4QZNSkbrMnkh|q7BtM17xa@WcXcDeO1JM1*9ReXVM31(1(7G10IX%!|oyofG z-0UCs;d`7&%h9wNV-I(c2XhEq($3ZDoZlYeyiv#<&N%G+(8F=Gdn%(;zAD$^{m5l# zr4Wn7?&z~CyR*=w)spQ2C%sXE6fQdTd;+$iM}p=~eBIFFn+1Bj{#h<{2`Y2uJ9T7D zmC?&AW>XEMhZ>9qaJecbo15wC_how*D|o^^T3|mCjiw=Y%6dKJ@Y@@tB0pU{G9Pz; zv;^*^7#l*W{{&QR7DrkOY(UkN%klg7u2Cziq5S?D%J@=n&KThKv5Dd#A1lMrD5&Gf zAZc31@p)|7FJg{%=5j3~R*hB-;ztX4(V++5?KW66y*HT5 z)2}X8xz2u_TfF`BbyK;~)Wd4YQNm>otI(8XFUP5aMEM1$T5VEqHn?4bOsjEgE@Ks9Oco8xG@80%7BvQU{-14n%`KfU>~fHhc|Ty{mU!e-y`aBF1d zC{@g7V`I*(=Ca9AK3Ic1-2!Dx_WKHsX+0O->3gqp+e(+b@r=SL+Z{85O(z@k)TH}@ z6fV9_Z|&OoaG=ZnQ=c|6yQ67x4OUl-=PN^t)EgbY+xOJ8BjTlGTXW_UwslW&?w**I zE6~Im?AjgA+Rf7;^VD8lZooML3OwIc`YCZkV(+K{f||&*ef7nmQnEy26H+eaI&BLG zl@YHI9~FD0#gxW{@*hsGL?x^l%ado&?`1BnXox z$1(PT>0-=cOaiKIVes9eHL$SDe*Qj17(;|W)0O1F)ya1|T}~lH+`}(X)CuYIMDWHV zCoj7$e(O-k^lg7v!zyf#lQNa+~csSs6iv@^^6w9X*#P^$m)VcL(xDd_TQ z*Oz@IA7bIW#(KL6z1NgX+wwzB;kl~65}2g$uAt13KdvB5TPNzr9AU!xjSh_zZ6gI{ ziqEN~X{P#m7MP0_rA5bgWj=(zKHDtjlHWQdJ@{6^@3>S-T6rGSA6d-(l&!oG-#HGW zCsChwkCy8yhY2a)SZfKH&56V6qXqSB$@I}I+@5Fc8_Kq+>-$lV0N%LRFVs}idvY7rf{3n6KNtr*{Nj2UMPdfayu>3_^K^$7?SynkTOO2;? z*o}Aw6F{Yp3w`G9tyFjbcAFxtM$Q+D!w}?|q>%U&Q%|EW3(FNY!*!dU=k7^3Zx7Sy z$Ajt3>JXWnEtH!@imM9Hp=|yA-&?|ScuLvh%0HD$B)v1|J#7y4_}-B(kVrDf#Z-Qx zKQ>JjO)tvR)8nv=)^GBI4Lx!>_tlwZkJP!=H|rQ~i@vueUDM2kxerXLruAs`qps%t zPCsgn4WsNF$Ejs$M^$BrCcj6~cjcSkIv43*a+M(NQWzV0P;SAR1dpJK84lvd$Z|=%Q`7@9=n}}Q@MIAO15F=jgd#ti(#$UJLdYI z4QQrP5**Y)jD%Fa>Z1hq7)R=iw-$qnTD6t*`Fnh&vS&;mcjwPD-*6qo3}uMo%|0xb z%e0GDP;S_HQeV;D1Bs>$pQaH#JqVG6CWAgG+pH@5`(}>q0RHAn~ z861Yyi(VB=DwhGgd}x$Xv0^u$7DBlj6j*2f{<%h9e)A=J_Io1ElJYC0yy%i+jVi6` zv^1JID|T|(%&5}=)LQK?Lk10!z@ZFyp|MN1-)E_vnR%}2hgPA8-)3qJyrXVqyU16A z)S2@0F5e%^SX?$9W$cHak)0a_Gw0fa|{ zlS<|?tD6)uWJ~5*hrT}&P1iRPYX5v}GLysn)@j3!$$1`BKS3JNA@$j8I%k-)nQMd( zmYEEETVXJcEKh#wiPREm(1~HD-?U^j793x>=@S?=w3h1fR%>S3_EFEVAF|<=zsDO< z{Y!Q`h29MXDR8ysTYc>sXqnM|-E-3`R|XBlLe&vhsULCMFY8bHHJ`4Dr zuoKLc|CPCRj)c8mN}+ImrAM2j5%cn6zr$p5r;eQ){oRSJIqjCJNr$#q+jR}8cJn(H zTzn7;4e{rJE7BW`>swS#tp%M-&hg)!-_haGh^eg5=`b+t=+D+YT1U!{mio1zH=4sQ z$kwM4+)<%brLr~F^rbI>Q_sx2+U7OGGNm_R=(+$DKyv&&a9 z*)VAmj?aRVKt@_gbe2fsO5LBhWKuE658s2F9I|@x)JF{~bnnN(6t7-A&n!2Pm?Wl3 zn%9^fSeGR|TyL*D>P}vX1I_tTNq%NI%-w=Ts=}{fDB`(nsQ%^s{zQg+=Gn6CsL=x-Lu=*l;~{I5oL z1py~Z3^6)SnpNn*2wJ8b9}2siJ&-9Kveh_HF`Iue?9_VXT#nJ~kodUH{twT=4jqWH z7`Jb+THHJJd4hS!Gw3_jxcU<**bR$C_%x~eX?cA6_sIhK(1)MQ18(dP#0NZt5bOx_ z4!804!~88Qt9|~F1wD#ctIhToSncZv=x(pZ!4(sc&6@PHSDGtqRc&IYH~|f;-{QH= zvEHO!O!6EaD0iGW66_9xYk$hj<{JW-&DK`I4duJLCb=x-nLRY!UQbHw5 z$-WiYvQrdUvW6Iuec!VaMTE*uwq#$Xj3tJd%2xJ$8hbRhF=QPK<~hf>p8NiP?$7_l z^Xhr?csIWp=X#vSc`V=a{0&(&NWHXJK5?#)Y zQj~iKrpimuiywDee`8gM#m^Mp%rVj+Tv;jqm9V6M9pugLTj}bj#1|SBE^`{JVVK2( z_37jicjQM~8}2w7R4+Sj_2j+qGR&|U!g&-`v&b8jx5{}h;Tg8V6|+$p0`~pa_cu`| zXfE7R3Rk;d<4nUoxLUAZmr46ocDaXE=*TKg1XeMhapVX{UC~HzhmA3`cir~`7bqu6 z;`O3;C-3i!`;OV?OTAhD6mQ*b}&B~>btbam7Vkk^x7Of?p29LgkD$OxB%P8u} zn5p&~6~>`&nUIgaEJdqjmX%QAyI^R~3a4{UjfW2%dZA3KDpFcpWDk zOhj!zOa%L;^Ct>_xFxPJ>WCO2l(*|+b1-M~k~k*?Or%3zMI#c8+K5utDIJeKU$CY; zh$kfT4us=JBvDMl1Ipv(&N*xOr&}&WSg=`%3X?-yU);lTs4+J1rk^kTd6G0a0O?bi z?DEsPR{j-Mi8nse!ik~|1oqR`;wM*18~hGJRtSy(zl?o@ch(qjXbDql2JVl!4Socr z=tp~5X5G`$bNg?`hdz2kx-um0OMA-NXWW=$;_cHXC}fwW{Sp|e>Chppw_{?8@Q#{G zXBwz6M0xqZ+LUyOqVodu&-}`Mem+Gu8rrC)g%Vc|ro|dZDl5RPSf#evJo2~qyj$eFZ25itw6tFV1W>m93K}9fk5_>}A&~V~wbpv}Sj-_D!+jCwx?S3yF)IDP9 zjIJ?Vi48Qn(^1`DAtaV~)lYOh2yeE#R!Zr=^yXxeyjdr)glb6$erro8jr(JO^3IlX#$bt(wPq%B@lE>ybWJIuU-87>DLOI!jCtWm zKXlLcuZ`la7~2waZe(|+Ox~LnZPcE$9|X9^7ys$7Uh0Un(ay+OLF}tC*a{D<-SHH+X;zHAq@W`0 zfr<5GrN-Rge5JvGkMI!FJ8;Mt@n7A!935SMe*8FWd9*Xm*1x1I^Q?mBmiCZqpW5V7 zRBxREu@W}AUO)#En_$<z;|X0CRQN4o*ofQ8-A|`)N6Je|)$LI|S47 z?1F5j(O?*C1p7GS<@naWu`;}kNhvR*5Miv%4cuv!TO2Kq1^2E&|2A+O#Ujzfr1T*^ z=uWAEQQjigP$SU|LvVd8UT$V+Eij}H3?pZ_Yuw%!#Dl?z1#tPRL)S2+dLr)|l2gJ1 zvoZR5mCO0h#K)O{al9foyrR}T$ekneGGooRXw z10PG6RF^GwqSt%Yy?vt`!O*Xn;`9!dKUSC^?IU#y?sCHtn=czIdKuJL6)$!38L#O# zRw&q%KYeMr<2BnU-Pm6gNi#cpJs^{~ey8u6!?=AE&7Z8Mzy;Xd+=h{cO$~T+i|76Q zkI2Pg!5M}J&+4=<*i(@MV^Y-38oZK9_=R^pB{t(B%B|HM+MRFT6tlm5xbeL?gk8`AiQDeA2qlzEtTXA<+2fQJ|ap(d0!B2U}5#vA1mDW|qWi&@NN^}I{ zZG^`xD61DVNG9?c18lH4kmD)8nlQ_rCg7-UxNSd`BU)amb~VvEJ?vDAdL)yTz!L|- z!=(%~&WT|rsCTcv4)86^$llxxYjW6JH1+vwKc1m5N!D2R`Sbntzf5`_*T~&u7Z$U* z8!+CZ{Z7gmIhMxl9gVHH0oy3l$~K7pjUVeZe6;IO!Ij!(@ES|rYoam~8zR=i8qEzx zycUK^tmsAw*};3};_Z8=Zo!OWw`!mM!vc6u)UD6z;a-$4RVL~cYR%7O(+UK{$x6uf z7}rbtMEos+yN zz!!*Svi6^UKoe4$!t`7lh&cM2bozCd&$EK#AAbMPTZ~1SU^^EQF0D>@k?ec*c)LtHS*Rsf;70w%ml|KhcilkstP5t%Kgj+d2fc0B zQ)m1?(9}|6N^65T_xEefosCUdt{UBjxDMwQ-c4&i2-xntcS*jeFu7vVI;C_> z5Co%PayhnYa%nC<+ zNn59UyheL^y@X}}0z2R4RC)mwuCttJQFLNGhB+@$%Khq!n~MiinC!6EqbPFlQk!a8 zJhANwRmlEkp@&?$ZZ=MViFMG*BZ%Z0p&B!1yHo8_8d6ywjXedqS!lY#vpV#>mLccdO=>qbZWQI+d>DQo}LU@Hp07 zQ0JPVSoiEMV@%U#FK0aA3DQliBssM?#eN(Gayo8Q2W9}s zfWE2yx`)bZ8){s+&}G`7wI5K^`zAZSSQEDB|NGa;s^tWn!-z{Lf^c9vRHXZeb8_)R zsS&i~3C71Kx!wvp0%C`1`+sJji({UNvm)k&K0*#9+ISoFRF1Hqn7R2Yncl#3-L-31 zX5HD5+*}^kPZ2gV9H^ljf~t9%HSX4$2h6Yr;5>V5P^pj2a0&#P106q4g?x|v1N4LM zOU7&ni}Jr3`_x4cV-GV7wRF~goDjJ`s@4~?6>sT zmASJEF^zHX8q6w(C0)Chda$?Nz!p^SKDnDUpNGAttjA}`pf4p0CN`>PD>RUprr~_| zV6`x>L?0f57?V{wdm2?@OLQM0pq;qxzE(u;?ZVl<>zYjB%!{PgQ9p&GM!3bSLg5ys&Refs`tDY5DNAFNn=;+>QHtcXR4*F3ocV zJRU}Mk0k;(0>n0FM-!?XJI=_kXmiBxdwxqIYog{zkl&LZoN?1u_PhM&+Bkozc6Q@f zx4%g0PR%&Ft@E9NX;GGZFcRwVB;=8bYOs?nLQZX`|M^ngtVY%>mlDJ&y}~bMxY&Q+ zMbfLcvnC_W309U5iD&ZhQ*S+Ezwup#&JI5j?tg$@D$&g?vUv{G2i{;FwCA;aEDfeu zm&>TnLuja4B`9AzL)|;0(S6+M^BiS_WQSqumH5&1rXg}OrMN(rQ++tshZ^G^*=T%S z5?hr~8zQz#^NxF7K7q&x7sULDN0yjo`<}0xmy_G;-S^S-#Ure$gV9e}+B2#yS`cMD zm(^plZ)!U-#lplEZ3H?+d_t^%mUx{Fw_web@ik{?-RN(;*kAJS`LNIRfZDF%mY9@{ z+so}ERSwV0zZ0sovTl_YLW(Z#=WDL#KK@lnQ!iq5OU84uz%SPBlo%y(_|K2Uendqk z205g}5l?`roc@otBf|E5uS-JKZem;KG}#OKTh_6$N;Be48|UE#dl}&hMa0+CKK9?y zo*`(VQ<_Ctl0ij?{pBd2s&ceZ_xpR0mj^VgO@4})%dc-Rq~CHZuHU#^-W0&ZCn)$S zy_&@i`PAxD*B;S8BVOC8 zJSUy1N~-fkBUKlJ=c3PD>Wrkr#w2@a%KyU&C(v$9ejV!!W#;W0oZ!%|C>z8E4bk zQxJN4+p(^CZ-#zIMXw1)oe><(U;N&%*S7Rc)OkxZz-7+IyE<@_DPJ?8zx!JTj)|pe zK2NW(2Tez5(^Wqw^>khhJ~$gG7voybcr|Ryx95z|Q6~RiQ3C?gFhi$ymaLVpEFYvk zC(~IzX!o6{wEzpNSC?)g18|}5tOYEs^kgF~e5G#u`nk8fh7st44chh`6c=fvB#Pdt z#D0TG$|<-{SMAfk7BtqqbH}W5R5<;Z>+pvRZ;W#WN@pm#rNO>EON9fU9?fuMm>Gdg zcEeiR-YfvkGsYMGX6O`~bFuX`&z5kNvFgVri!}4ugR@N2Q;I?WB z!bKAsk&6F9M(8g93gAmoII0nF!J3SD44T)qQ>xPpRf8Q+ujkrVKk%oBSo&JNT$$Ns zFRZdd|JC?t`-FA37u0C{%IkoZ=6ht}qk09_w}tvIGc{5oy=AscrqO~|!nw6goN8@b zXD;hV3uuC@y`%yXz{)e;@b>|91xDzjbAu%1252VIflKNZV&J|4dmZ4Ms~`3m$gmdV$^>I7J@MGWJf+ zNl%J8LKdI@tHT}tOBdBCM_J}mV@e!4p!Roa%w&^)iUjRw3tfB}P7y|`mX;}_;AkFB zf_ae5@zn7Bn@asU&ujSlPA-bv*)f2Cb+3mho}rqSNoDwMr6Z_ylxn>LlA_FvF%^Hk zPz*fbN#SQPm~DR4NfPf(Z7_1i|9A*!nqRMi?iqSg8#tOtoWsGf>w7;>Zwru$gK$=m z8S*beptxH7=-|ITgbsjCv%R)1JYvnZAAxkRr|zXQ;>Qc0Nr%Y}W?gGNq@w8C!K~|4 z$XnslLZPH_w$0DIa+H!i0zE#kPz5rAzPc1i1RYgW3o4rQ?>C7$-7F58pt5(|a{I8a zR|Ei@f$kS`E2Oey0so_A5aB}}pHqQge5O!QZ1p-E1*94Ic6Gq|C=SgFfRQWQnpfP) zLuAuNP?k2KbPw~x4kDH8zV^iWa+pZh}vW;**z-4VYh3@~_j(L=AHeTwYPvMr5V zlV5mv$hBAhz)OK7swIygQ6K;?>o%U>)&yw{HLQkapWpd7v6d6?nZ zU4|v_+yZ)ihMWlCU;-Z>=D1T+xRZKuJYM5yJsE=a^wBWc{X_|9q>g|JlH8mqHIg2h z_Qbvh9O1u#g0)~s)+0EkAb@lVX{=)*k5~mL6aN0bmuM8IT}l7`3o;TJ3I!h#Z$Ge7 zH2~}-V6NGitjQw4b|?Fxy~~195$Nw@cXEy_4yttUyq8}&0mw2On$x!G(o&tpbP6;@blM#GU2L+%W!Io zqzUM$_JDT5LnVEWQY4JvsZruft-k<=DjOC3Lx(&9e@IxZ(c7xMS^T(I8wrNmTw^_$G!(K%0JYNjm*c zVRodU)l>iL+!Tckcm+xvgryz2k3Y5|KYny<{7Ap8w(z#wk}Za{Y4 zouoKUq<(7Cp~-8TJQlJ%MosQdC`rfzU(Q?5lfFEpx9Ay@kBByUl3DQRL>=4ll@sUG zcXf0(4+w5A=EOHURux6pVfF3Q_x(j|_A>B2zqDWVKR^QN`k;ja*9r-*_ei}?ReaNxtfbEF2?Fz-tWo_R0 zG-lf)SG63>rYT>y=WU?$PnBB5o@-~#%YRHNHH;pNK;$+h{bUnQVw>*?OP>&Bzs?3J zmc#Km?g|$5gt~hcCzvF)hpdhu4SGR{=CIU=&p=|D*+aM4a0`xEfL%Y>%3z|GS zPf22C7`=WOZ1ytW79RqyyUou20;$x0cHd_FA8O31Sy<{g=&YDXH(5@X0$ro&RNkQn3DlN^Xh(7Tnto0kqq2Ls(D$bvrsR7zvgw5%GCmAH?$ zhIwfJ*~gbJWT&kadGo+<+_O%G#K}JK8Eqd$?=9RL@z^X3nxWadlqbSII99 zOa0eWPQKI$ULG?xlOm>^;Wd69uT zmGV!0qf}`Y7&MLljme^h*0mkTLHHfF-l>DzSF}eO3^?byv-;vA>G(iqDsF;@I~L5r z`qxAT@+ zGwdF3dtv+~vbj4SzK@`0upj%bbcwi3&nT#?48^k+@KioQ=9aYu6AYRrmx@VwqbA27 z?+sM8LE!@d>-N2<8W(eDR%ZIBd}6VV**Jj?H3_0Hs{+;=xUe9HpAF&8_&H7mJGaS- z8tu*WDudDPMx0X+v|DJj~f(3sfzNDmmg$kHG1vzb8Rk-J;K4a`i4r4Trb35 zM5X?s-0Y|?iC!Hd7T(w?(GexhAy^ zFI(d-KT)`l8oDGcZ2mcC(Ryw4k15hvW;38MlLmQKpoV`Yh^|Pn`~Ib!0|h1G4Bh0L z9gZ7M2h~h!+~QhaT_}1mW6QhV6kn_#w&c)TmI;ElCB82<2VB)c`kIY93<`D6dM|7i zn13g}-G@=H2uR`v*h4PsZT9a}dvpYgmpoW3m@&S5LnUUeC)!7homO-#0J%Tq1_RN< zA*-$<|EKvOP=g@1`6r(=I%{`+rQg_*0|d-&fmlO94|ih5b+{c)3!a$oi!xMCk+h{SvuR`;oA>D#3Id9D=i1ixf*%W+8Mj;DK}RqL-arr%DyRX#e0%6 z?a6Qks#N!W*NBfn-#N_tv`)d`b$`ZcuYF+va=k|$?CP~-g($P%H~pZ-7N849Za>=j z`}`-d(bL}w?Z1xMOI#zaftOd2vnL;6D9)33613<%smURdDge8xAX9{inO$thboe9_ z(L6+B8KezXa`&KDNhmtC;%gp{1EEG!lC=j7D>T@sYpeFdpXIvuR=)+(S;BV~FlVE# zAdgO1TPPGFtN#NC>8J!flmhWLrZh!l@O!Pl+DVt5oclTwU#sq}dW_WDk9&U&QUupY z@Ajo)TeBt1{$fE$mP7JEy5QwO=G@%l$M^JeAF_2B*BkR_U#`vFn{4~?YsMf?D`B2J z!#Ge3>zv$?%5}wNw!!1&ocQm|m+fo%v_aQxiuONFN#D(0=wW~r$Z>nhaB?CnutO{Si*X?;5To~Au*?nI`v zx32Z+xvIzG4DFg1Bw$0N1RXooTP}^ql=y>22>-fDJfCL$Mqki%4Fi8)`}`Ix;-iLR z=Y7AOt97`_#O#n=rKZ1pPyhhjuqcScRVM#(-RiIMdn1vEpC24M@cXf6?Bmz{TUx+- zXN}9O(c=yQv8!CShA1kEVb)*8H0)w~JTKjxrj#K}=J-5pbwgm7x;WRp$ zHv&w2L9K+1KUUgBE_uVXfnMOi&bH|t_QMTi4A^nLRzuH0AYH^y)kP);z1guwkNyNB)(?3BJ8At7nR37wMF5M zFVWU5m%)kPex5f1iTs)-GJ4}R?&3iR@4R7GV)t^KZs|9TKJZSISu2CGEnLPFc}fhEO9bYn||Gi*Itdc@mLWd$)l863rHfJo;*-<3CL-w$GEQN{_*+Y%&1 zQT|bCP3PlQ8yj-ujKxqS_ghOx2`L@)uJ%&AeUnq|&+;HnFiGtrV=macHtpeC(5sY( zMs1WW$qQlT7<66f&{_U;Q)Il(?N9K#FNN%Hl->Dj?C(m9G4;3kWP|>JIdbjal8!`yzDOtk20@ z*+F8fXz-z8BA*uMuP~y}0+zhXQd@#7ygXHisl%uu|H?jmA>T3|hnTM&LG(e!#T-{N zP{lbh%p$i}XjOReDe`zS%RNOToi(9ZJv;z%EL-XTE>QuoM!n7udCw%Gw~%ZqxeMdq zIgqNTE@cu3`D$5D{MzZ;ATEaSy*5on){mCJS&V07Vct78}|r5`MlXD&r~b0?m(G?-@~8KR2UL1E#!(ZX!u zEXs9gQMc}m_(8aahJf?dRj5vN&G;mtkR6GdLYU#OxGs%ofU%SVv2o~Vt-cjFA9^4a zd>`UO)bBT2l=LbSwGM8sd2GI6wZ)4hhTXpvw3`^6Qeg*~7Ar!PnjoYe0SH|u{(y7i zCxbEW06U{f+rRA_`7;|i;hUQE{jHpNi571>vyaQ6vrbPzauRqwIOzIla>p9B=Z2EK zZ$554mnPQ>0WbjKGml1%?GlR|%m0g5FPYv%2||jtx*SG=kXUgSE66GR3U#5OvQd3z zkw-d!DJjKg&`Q3s1Da--WT=1dMnhR`jx+L|J^HSsV?WnSc9}eV3uz6`3o7)NK zB}Xg+5A8rjX14wBsR@(%$F)Ik;;Db1@U*Uh!Y1L4g)|G?`Wcf#kn=9#b$()Vk_4Yp z>+p7yYCoi*PzH3SEp8;J18c}vFl35+04|cYHkW$R4K*o!!_U-_MhB|ow;{gNx$nPEj#p*clvf?NrVS7!BgdMr=$md zRpi}VO7B#cQy3(>ObKz1Ck$ZRCE=4x2FPWcL5-z1%LiKk_$SPj4T4U2ZMHMw2#cpN z?S%JNjRfn36EnOQpfyG1m+RIXfKeU$)HR*0=dI8!a7%uc-hO>;OqRD~$CJ)(K|cs@ z5$Tfhi})u$bbo$9gsh~r@AX=#CkQuAcBu2>Wuzq!Lz<_67vvXp{+3SU!V4XFK=ztk zxS^6@3)KPd)x8<0qfNrEfdTa(v;B^^XWw7eU0bgJ&R%e3-+Z9Hht7U{F+cs5dzo2) z%d;x!n!t0#fNdG!x}Ie%l$ExoF1{!L*$UV^NIb#6=W$V!O+g)2sM-7KIg5UUo7U!~ zo9fmA!@XH%GWz+yPn!V5nP&6d_Y{3h5aP#Sv6n?0v8>A-la^2vc9;Z6?#ckS0-h&$-R z68HT^ye=+X+H#Wi=m_kqGJKx$Uck;Lr1)XER)c<`4x7l**!e>-q5@)cMd!C7+j}5J zt8kEW2X75%(k-}`G2s$9FAeajQUJQDXI;(T*R_2_3k%+#ZaJ-<#=q%}kBW}&M~f9M zol9lC*~@q+FgYM{bJ9S1 zT=If)9o#{c*Vm|VUWlZxLIXg1mWvH^wt#bAQF#s=>k{!ljB8J^f&DhXfiY1IsKL@Q zaBOQRX5x?mJ~~2n!djaev&=7$J7%`|zV>kaE(5uQ7aA&|^*}Z4z*GFcYW^pK#?T(_ sVR44vgmeOMZ{-XKwjYkFFa5Scm~rYE*V&FA$H3pcJ6g9Zlr5h97xtoUga7~l diff --git a/docs/gateway-guide.md b/docs/gateway-guide.md index 2b392ba41e..8a930a37e0 100644 --- a/docs/gateway-guide.md +++ b/docs/gateway-guide.md @@ -1,206 +1,71 @@ # Gateway Guide +1. [What is a gateway](#what-is-a-gateway) +2. [Components](#components) +2. [Specification](#specification) +4. [Managing Event Sources](#managing-event-sources) +5. [How to write a custom gateway?](#how-to-write-a-custom-gateway) +6. [Examples](#examples) + ## What is a gateway? -A gateway is a long running/repeatable process whose tasks are to process and transform either the internally produced events or -external events into the [cloudevents specification](https://github.com/cloudevents/spec) compliant events and dispatch them to watchers(sensors and/or gateways). +A gateway is a long running/repeatable process whcih consumes events from event sources, transform them into the [cloudevents specification](https://github.com/cloudevents/spec) compliant events and dispatch them to watchers(sensors and/or gateways). -## Gateway Components +### Components A gateway has two components: - 1. gateway-processor: Either generates the events internally or listens to external events. - The implementation of gateway-processor is provided by the user which means the user can easily create a custom gateway. - - 2. gateway-transformer: Transforms the incoming events from gateway-processor into a cloudevents specification compliant events. - The event is then dispatched to watchers. + 1. gateway-client: It creates one or more gRPC clients depending on event sources, consumes events from server, transforms these events into cloudevents and dispatches them to watchers. + Refer https://github.com/cloudevents/spec for more info on cloudevents specifications. + + 2. gateway-server: It is a gRPC server that consumes event from event sources and dispatches to gRPC client/s created by gateway client - Refer https://github.com/cloudevents/spec for more info on cloudevents specifications. +### Core gateways + 1. **Calendar**: + Events produced can be based on a [cron](https://crontab.guru/) schedule or an [interval duration](https://golang.org/pkg/time/#ParseDuration). In addition, calendar gateway currently supports a `recurrence` field in which to specify special exclusion dates for which this gateway will not produce an event. -Core gateways come in 5 types: + 2. **Webhooks**: + Webhook gateway expose a basic HTTP server endpoint/s. + Users can register multiple REST API endpoint. See Request Methods in RFC7231 to define the HTTP REST endpoint. -| Type | Description | -|-------------|-----------------------------------------| -| `Stream` | Listens to messages on a queue/topic | -| `Artifact` | Listens to S3 Bucket Notifications | -| `Calendar` | Produces events internally depending upon date/time schedules or intervals | -| `Resource` | Watches Kubernetes resources | -| `Webhook` | Reacts to HTTP webhook notifications (Git, JIRA, Trello etc.) | + 3. **Kubernetes Resources**: + Resource gateway support watching Kubernetes resources. Users can specify `group`, `version`, `kind`, and filters including prefix of the object name, labels, annotations, and createdBy time. + 4. **Artifacts**: + Artifact gateway support S3 `bucket-notifications` via [Minio](https://docs.minio.io/docs/minio-bucket-notification-guide). Note that a supported notification target must be running, exposed, and configured in the Minio server. For more information, please refer to the [artifact guide](artifact-guide.md). -\ -In order to take advantage of the various gateway types, you may need to install compatible message platforms (e.g. amqp, mmqp, NATS, etc..) and s3 api compatible object storage servers (e.g. Minio, Rook, CEPH, NetApp). See the [artifact guide](artifact-guide.md) for installing object stores. + 5. **Streams**: + Stream gateways contain a generic specification for messages received on a queue and/or though messaging server. The following are the `builtin` supported stream gateways. -## Architecture -![](architecture.png) + 1. **NATS**: + [Nats](https://nats.io/) is an open-sourced, lightweight, secure, and scalable messaging system for cloud native applications and microservices architecture. It is currently a hosted CNCF Project. - -## Gateway Controller -The `gateway-controller` is responsible for managing the `Gateway` resources. + 2. **MQTT**: + [MMQP](http://mqtt.org/) is a M2M "Internet of Things" connectivity protocol (ISO/IEC PRF 20922) designed to be extremely lightweight and ideal for mobile applications. Some broker implementations can be found [here](https://github.com/mqtt/mqtt.github.io/wiki/brokers). -## Gateway Specification + 3. **AMQP**: + [AMQP](https://www.amqp.org/) is a open standard messaging protocol (ISO/IEC 19464). There are a variety of broker implementations including, but not limited to the following: + - [Apache ActiveMQ](http://activemq.apache.org/) + - [Apache Qpid](https://qpid.apache.org/) + - [StormMQ](http://stormmq.com/) + - [RabbitMQ](https://www.rabbitmq.com/) + 4. **Kafka** + [Apache Kafka](https://kafka.apache.org/) is a distributed streaming platform. We use Shopify's [sarama](https://github.com/Shopify/sarama) client for consuming Kafka messages. -| Field | Description | -|----------------------|--------------| -| DeploySpec | Pod specification for gateway -| ConfigMap | Name of the configmap containing gateway configuration/s | -| Type | Type of gateway | -| EventVersion | To mark event version | -| ImageVersion | ImageVersion is the version for gateway components images to run | -| ServiceSpec | Specifications of the service to expose the gateway | -| Watchers | Watchers are components which are interested listening to notifications from the gateway | -| RPCPort | Used to communicate between gRPC gateway client and gRPC gateway server | -| HTTPServerPort | Used to communicate between gateway client and server over http | -| DispatchMechanism | Messaging mechanism used to send events from gateway to watchers | +### Community gateways +https://github.com/argoproj/argo-events/tree/master/gateways/community -## Gateway Deployment +In order to take advantage of the various gateway types, you may need to install compatible message platforms (e.g. amqp, mmqp, NATS, etc..) and s3 api compatible object storage servers (e.g. Minio, Rook, CEPH, NetApp). -All core gateways use kubernetes configmap to keep track of current gateway configurations. Multiple configurations can be defined for a single gateway and -each configuration will run in a separate go routine. The gateway watches updates to configmap which let us add new configuration at run time. +## Specification +https://github.com/argoproj/argo-events/blob/master/docs/gateway-protocol.md + +## Managing Event Sources +All gateways use kubernetes configmap to keep track of event sources. Multiple event source can be defined for a gateway. The gateway watches updates to configmap which let us add new event sources at run time. ## How to write a custom gateway? -Follow this tutorial to learn more -[Custom Gateways](custom-gateway.md) - - -## Gateway configurations -Gateway can have zero configuration(idle) or many configurations. A configuration can be added or removed during the runtime. - -### Calendars -Events produced can be based on a [cron](https://crontab.guru/) schedule or an [interval duration](https://golang.org/pkg/time/#ParseDuration). In addition, calendar gateway currently supports a `recurrence` field in which to specify special exclusion dates for which this gateway will not produce an event. -``` - calendar.fooConfig: |- - interval: 10s - calendar.barConfig: |- - schedule: 30 * * * * -``` - -### Webhooks -Webhook gateway expose a basic HTTP server endpoint/s. -Users can register multiple REST API endpoint. See Request Methods in RFC7231 to define the HTTP REST endpoint. - -``` - # portConfig defines port on which http server should run. Also it serves as index route. - webhook.portConfig: |- - port: "12000" - endpoint: "/" - method: "POST" - webhook.fooConfig: |- - endpoint: "/foo" - method: "POST" -``` - -### Kubernetes Resources -Resource gateway support watching Kubernetes resources. Users can specify `group`, `version`, `kind`, and filters including prefix of the object name, labels, annotations, and createdBy time. - -``` - resource.fooConfig: |- - namespace: argo-events - group: "argoproj.io" - version: "v1alpha1" - kind: "Workflow" - filter: - prefix: scripts-bash - labels: - workflows.argoproj.io/phase: Succeeded -``` - -### Artifacts -Artifact gateway support S3 `bucket-notifications` via [Minio](https://docs.minio.io/docs/minio-bucket-notification-guide). Note that a supported notification target must be running, exposed, and configured in the Minio server. For more information, please refer to the [artifact guide](artifact-guide.md). -``` - s3.fooConfig: |- - s3EventConfig: - bucket: foo - endpoint: minio.argo-events:9000 - event: s3:ObjectCreated:Put - filter: - prefix: "" - suffix: "" - insecure: true - accessKey: - key: accesskey - name: minio - secretKey: - key: secretkey - name: minio - s3.barConfig: |- - s3EventConfig: - bucket: bar - endpoint: minio.argo-events:9000 - event: s3:ObjectCreated:Get - filter: - prefix: "xyz" - suffix: "" - insecure: true - accessKey: - key: accesskey - name: minio - secretKey: - key: secretkey - name: minio -``` - -### Streams -Stream gateways contain a generic specification for messages received on a queue and/or though messaging server. The following are the `builtin` supported stream gateways. - -#### NATS -[Nats](https://nats.io/) is an open-sourced, lightweight, secure, and scalable messaging system for cloud native applications and microservices architecture. It is currently a hosted CNCF Project. -``` - nats.fooConfig: |- - url: nats://nats.argo-events:4222 - subject: foo - nats.barConfig: |- - url: nats://nats.argo-events:4222 - subject: bar -``` - - -#### MQTT -[MMQP](http://mqtt.org/) is a M2M "Internet of Things" connectivity protocol (ISO/IEC PRF 20922) designed to be extremely lightweight and ideal for mobile applications. Some broker implementations can be found [here](https://github.com/mqtt/mqtt.github.io/wiki/brokers). -``` - mqtt.fooConfig: |- - url: tcp://mqtt.argo-events:1883 - topic: foo - mqtt.barConfig: |- - url: tcp://mqtt.argo-events:1883 - topic: bar -``` - - -#### AMQP -[AMQP](https://www.amqp.org/) is a open standard messaging protocol (ISO/IEC 19464). There are a variety of broker implementations including, but not limited to the following: -- [Apache ActiveMQ](http://activemq.apache.org/) -- [Apache Qpid](https://qpid.apache.org/) -- [StormMQ](http://stormmq.com/) -- [RabbitMQ](https://www.rabbitmq.com/) -``` - amqp.fooConfig: |- - url: amqp://amqp.argo-events:5672 - exchangeName: fooExchangeName - exchangeType: fanout - routingKey: fooRoutingKey - amqp.barConfig: |- - url: amqp://amqp.argo-events:5672 - exchangeName: barExchangeName - exchangeType: fanout - routingKey: barRoutingKey -``` - - -#### Kafka -[Apache Kafka](https://kafka.apache.org/) is a distributed streaming platform. We use Shopify's [sarama](https://github.com/Shopify/sarama) client for consuming Kafka messages. -``` - kafka.fooConfig: |- - url: kafka.argo-events:9092 - attributes: - topic: foo - partition: "0" - kafka.barConfig: |- - url: kafka.argo-events:9092 - topic: bar - partition: "1" -``` - -### Examples -Explore [Gateway Examples](https://github.com/argoproj/argo-events/tree/master/examples/gateways) \ No newline at end of file +Follow [Custom Gateways](custom-gateway.md) + +## Examples +Explore [Gateway Examples](https://github.com/argoproj/argo-events/tree/master/examples/gateways) diff --git a/docs/gateway-protocol.md b/docs/gateway-protocol.md deleted file mode 100644 index bc9a89d875..0000000000 --- a/docs/gateway-protocol.md +++ /dev/null @@ -1,223 +0,0 @@ -# Protocol Documentation - - -## Table of Contents - -- [github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1/generated.proto](#github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1/generated.proto) - - [Gateway](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.Gateway) - - [GatewayList](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.GatewayList) - - [GatewayNotificationWatcher](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.GatewayNotificationWatcher) - - [GatewaySpec](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.GatewaySpec) - - [GatewayStatus](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.GatewayStatus) - - [GatewayStatus.NodesEntry](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.GatewayStatus.NodesEntry) - - [NodeStatus](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.NodeStatus) - - [NotificationWatchers](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.NotificationWatchers) - - [SensorNotificationWatcher](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.SensorNotificationWatcher) - - - - - -- [Scalar Value Types](#scalar-value-types) - - - - -

Top

- -## github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1/generated.proto - - - - - -### Gateway -Gateway is the definition of a gateway resource -+genclient -+k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -+k8s:openapi-gen=true - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| metadata | [k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta](#k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta) | optional | +k8s:openapi-gen=false | -| status | [GatewayStatus](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.GatewayStatus) | optional | | -| spec | [GatewaySpec](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.GatewaySpec) | optional | | - - - - - - - - -### GatewayList -GatewayList is the list of Gateway resources -+k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| metadata | [k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta](#k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta) | optional | +k8s:openapi-gen=false | -| items | [Gateway](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.Gateway) | repeated | | - - - - - - - - -### GatewayNotificationWatcher -GatewayNotificationWatcher is the gateway interested in listening to notifications from this gateway - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| name | [string](#string) | optional | Name is the gateway name | -| port | [string](#string) | optional | Port is http server port on which gateway is running | -| endpoint | [string](#string) | optional | Endpoint is REST API endpoint to post event to. Events are sent using HTTP POST method to this endpoint. | - - - - - - - - -### GatewaySpec -GatewaySpec represents gateway specifications - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| deploySpec | [k8s.io.api.core.v1.Pod](#k8s.io.api.core.v1.Pod) | optional | DeploySpec is the pod specification for the gateway Refer https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.11/#pod-v1-core | -| configmap | [string](#string) | optional | ConfigMap is name of the configmap for gateway. This configmap contains event sources. | -| type | [string](#string) | optional | Type is the type of gateway. Used as metadata. | -| eventVersion | [string](#string) | optional | Version is used for marking event version | -| serviceSpec | [k8s.io.api.core.v1.Service](#k8s.io.api.core.v1.Service) | optional | ServiceSpec is the specifications of the service to expose the gateway Refer https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.11/#service-v1-core | -| watchers | [NotificationWatchers](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.NotificationWatchers) | optional | Watchers are components which are interested listening to notifications from this gateway These only need to be specified when gateway dispatch mechanism is through HTTP POST notifications. In future, support for NATS, KAFKA will be added as a means to dispatch notifications in which case specifying watchers would be unnecessary. | -| processorPort | [string](#string) | optional | Port on which the gateway event source processor is running on. | -| dispatchProtocol | [string](#string) | optional | DispatchProtocol is the underlying protocol used to send events from gateway to watchers(components interested in listening to event from this gateway) | - - - - - - - - -### GatewayStatus -GatewayStatus contains information about the status of a gateway. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| phase | [string](#string) | optional | Phase is the high-level summary of the gateway | -| startedAt | [k8s.io.apimachinery.pkg.apis.meta.v1.Time](#k8s.io.apimachinery.pkg.apis.meta.v1.Time) | optional | StartedAt is the time at which this gateway was initiated | -| message | [string](#string) | optional | Message is a human readable string indicating details about a gateway in its phase | -| nodes | [GatewayStatus.NodesEntry](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.GatewayStatus.NodesEntry) | repeated | Nodes is a mapping between a node ID and the node's status it records the states for the configurations of gateway. | - - - - - - - - -### GatewayStatus.NodesEntry - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| key | [string](#string) | optional | | -| value | [NodeStatus](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.NodeStatus) | optional | | - - - - - - - - -### NodeStatus -NodeStatus describes the status for an individual node in the gateway configurations. -A single node can represent one configuration. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| id | [string](#string) | optional | ID is a unique identifier of a node within a gateway It is a hash of the node name | -| name | [string](#string) | optional | Name is a unique name in the node tree used to generate the node ID | -| displayName | [string](#string) | optional | DisplayName is the human readable representation of the node | -| phase | [string](#string) | optional | Phase of the node | -| startedAt | [k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime](#k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime) | optional | StartedAt is the time at which this node started +k8s:openapi-gen=false | -| message | [string](#string) | optional | Message store data or something to save for configuration | -| updateTime | [k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime](#k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime) | optional | UpdateTime is the time when node(gateway configuration) was updated +k8s:openapi-gen=false | - - - - - - - - -### NotificationWatchers -NotificationWatchers are components which are interested listening to notifications from this gateway - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| gateways | [GatewayNotificationWatcher](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.GatewayNotificationWatcher) | repeated | Gateways is the list of gateways interested in listening to notifications from this gateway | -| sensors | [SensorNotificationWatcher](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.SensorNotificationWatcher) | repeated | Sensors is the list of sensors interested in listening to notifications from this gateway | - - - - - - - - -### SensorNotificationWatcher -SensorNotificationWatcher is the gateway interested in listening to notifications from this gateway - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| name | [string](#string) | optional | Name is name of the gateway | - - - - - - - - - - - - - - - -## Scalar Value Types - -| .proto Type | Notes | C++ Type | Java Type | Python Type | -| ----------- | ----- | -------- | --------- | ----------- | -| double | | double | double | float | -| float | | float | float | float | -| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | -| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | -| uint32 | Uses variable-length encoding. | uint32 | int | int/long | -| uint64 | Uses variable-length encoding. | uint64 | long | int/long | -| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | -| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | -| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | -| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | -| sfixed32 | Always four bytes. | int32 | int | int | -| sfixed64 | Always eight bytes. | int64 | long | int/long | -| bool | | bool | boolean | boolean | -| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | -| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | - diff --git a/docs/grpc-gateway.png b/docs/grpc-gateway.png deleted file mode 100644 index 3091f6f99f7ef79f80cd33475c5b50f737d80bb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69618 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 diff --git a/docs/index.md b/docs/index.md index 2255f58c34..1002c19eb4 100644 --- a/docs/index.md +++ b/docs/index.md @@ -10,19 +10,22 @@ ## Basics Argo Events is an open source event-based dependency manager for Kubernetes. The core concept of the project are - * `gateways` which are implemented as a Kubernetes-native Custom Resource Definition that either produce the events internally or process the events that originate from outside the gateway + * `gateways` which are implemented as a Kubernetes-native Custom Resource Definition consumes events from event sources. - * `sensors` which are implemented as a Kubernetes-native Custom Resource Definition that define a set of dependencies - (inputs) and actions (outputs). The sensor's actions will only be triggered after it's dependencies have been resolved. - - Define gateway to support business-level logic for producing events. - - Define multiple dependencies from a variety of sources - - Trigger messages and Kubernetes object creation after successful dependency resolution - - Trigger escalation after errors, or dependency constraint failures - - Build and manage a distributed, cross-team, event-driven architecture - - Easily leverage Kubernetes native APIs to monitor dependencies + * `sensors` which are implemented as a Kubernetes-native Custom Resource Definition define a set of dependencies + (inputs) and actions (outputs). + + +## Features +* Define gateway to support business-level logic for producing events. +* Define multiple dependencies from a variety of sources +* Trigger Kubernetes object creation after successful dependency resolution +* Trigger escalation after errors, or dependency constraint failures +* Build and manage a distributed, cross-team, event-driven architecture +* Easily leverage Kubernetes native APIs to monitor dependencies ## Learn More - [Quickstart](quickstart.md) - [Gateways](gateway-guide.md) - [Sensors](sensor-guide.md) -- [Triggers](trigger-guide.md) \ No newline at end of file +- [Triggers](trigger-guide.md) diff --git a/docs/quickstart.md b/docs/quickstart.md index 36551808cd..9e64d979ea 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -13,7 +13,7 @@ go get github.com/argoproj/argo-events cd $GOPATH/src/github.com/argoproj/argo-events ``` -## 2. Deploy Argo Events SA, ClusterRoles, ConfigMap, Sensor Controller and Gateway Controller +## 2. Deploy Argo Events SA, Roles, ConfigMap, Sensor Controller and Gateway Controller Note: Modify the [argo-events-cluster-roles.yaml](../hack/k8s/manifests/argo-events-cluster-roles.yaml) file to use the correct namespace that you wish to deploy the sensor controller and gateway controller. ``` @@ -60,7 +60,7 @@ curl -d '{"message":"this is my first webhook"}' -H "Content-Type: application/j Note: * If you are facing an issue getting service url by running `minikube service -n argo-events --url webhook-gateway-gateway-svc`, you can use `kubectl port-forward` * Open another terminal window and enter `kubectl port-forward -n argo-events 9003:` - * You can now user `localhost:9003` to query webhook gateway + * You can now use `localhost:9003` to query webhook gateway Verify that the Argo workflow was run when the trigger was executed. @@ -68,13 +68,7 @@ Verify that the Argo workflow was run when the trigger was executed. argo list -n argo-events ``` -Verify that the sensor was updated correctly and moved to a "Complete" phase. -``` -kubectl get sensor -n argo-events webhook-sensor -o yaml -``` - -Check the logs of the sensor-controller pod, gateway-controller, associated gateways and sensors if there are problems. +To debug, check the logs of the sensor-controller pod, gateway-controller, associated gateways and sensors. ## 7. Next steps -* [Follow tutorial on gateways and sensors](tutorial.md) -* Write your first gateway. Follow the tutorial [Custom Gateways](custom-gateway.md). \ No newline at end of file +* [Follow the tutorial on gateways and sensors](tutorial.md) diff --git a/docs/sensor-fsm.png b/docs/sensor-fsm.png deleted file mode 100644 index f69aaa4c21b0530e823d56032365b46e23ebadb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69427 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

X)uo>oGjR;cjU!~Y#UDg|j&;Cw?AuFV|9clS# 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 diff --git a/docs/sensor-guide.md b/docs/sensor-guide.md index cb6837dd4f..da30cd1ed4 100644 --- a/docs/sensor-guide.md +++ b/docs/sensor-guide.md @@ -1,54 +1,29 @@ -## Sensor Guide - +# Sensor Guide Sensors define a set of dependencies (inputs) and actions (outputs). The sensor's actions will only be triggered after it's dependencies have been resolved. [Sensor examples](https://github.com/argoproj/argo-events/tree/master/examples/sensors) +1. [Specifications](#specifications) +2. [Dependencies](#dependencies) +3. [Triggers](#triggers) +4. [Passing event payload to trigger/s](#passing-event-payload-to-triggers) +5. [Filters](#filters) -### Dependencies -Dependencies(also called signals) are defined as "gateway-name/specific-configuration" -``` -signals: - - name: calendar-gateway/calendar.fooConfig - - name: webhook-gateway/webhook.barConfig -``` +## Specifications +https://github.com/argoproj/argo-events/blob/master/docs/sensor-protocol.md -### Repeating the sensor -Sensor can be configured to rerun by setting repeat property to `true` -``` -spec: - repeat: true -``` +## Dependencies +A sensor can contain list of event dependencies and a dependency is defined as "gateway-name:event-source-name" -### Triggers +## Triggers Refer [Triggers](trigger-guide.md) guide. +## Passing event payload to trigger/s +Event payload of any signal can be passed to any trigger. -### Event payload -Event payload of any signal can be passed to any trigger. To pass complete payload without applying any filter, -do not set ```path``` -e.g. -```yaml -parameters: - - src: - signal: webhook-gateway/webhook.fooConfig - path: - dest: spec.templates.0.container.args.0 -``` - -Complete example to pass payload from signal to trigger can be found [here](https://github.com/argoproj/argo-events/blob/master/examples/sensors/webhook.yaml) - -To pass a particular field from payload to trigger, set ```path```. e.g. -```yaml -parameters: - - src: - signal: webhook-gateway/webhook.fooConfig - path: name - dest: spec.templates.0.container.args.0 -``` - -In above example, the object/value corresponding to key ```name``` will be passed to trigger. +* Pass complete event payload https://github.com/argoproj/argo-events/blob/master/examples/sensors/webhook-with-complete-payload.yaml +* Extract particular key from event payload and pass to trigger https://github.com/argoproj/argo-events/blob/master/examples/sensors/webhook-with-resource-param.yaml -### Filters +## Filters Additionally, you can apply filters on the payload. There are 3 types of filters: @@ -59,7 +34,7 @@ There are 3 types of filters: | EventContext | Filters metadata that provides circumstantial information about the signal. | | Data | Describes constraints and filters for payload | -#### Time Filter +### Time Filter ``` filters: time: @@ -67,7 +42,7 @@ filters: stop: "2020-01-02T15:04:05Z07:00" ``` -#### EventContext Filter +### EventContext Filter ``` filters: context: @@ -76,7 +51,7 @@ filters: contentType: application/json ``` -#### Data filter +### Data filter ``` filters: data: diff --git a/docs/sensor-pod-fsm.png b/docs/sensor-pod-fsm.png deleted file mode 100644 index 9f3d602afcb2072350b574ee207133e189f6c413..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45053 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

al4;&Hj|_hiEHd4rTp+yb8V|oop_1XR_8H! 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

gvao3r1~E7t~= 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 B|5yM3 diff --git a/docs/sensor-protocol.md b/docs/sensor-protocol.md deleted file mode 100644 index afef8461b2..0000000000 --- a/docs/sensor-protocol.md +++ /dev/null @@ -1,621 +0,0 @@ -# Protocol Documentation - - -## Table of Contents - -- [github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1/generated.proto](#github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1/generated.proto) - - [ArtifactLocation](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.ArtifactLocation) - - [ConfigmapArtifact](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.ConfigmapArtifact) - - [Data](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.Data) - - [DataFilter](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.DataFilter) - - [EscalationPolicy](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.EscalationPolicy) - - [Event](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.Event) - - [EventContext](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.EventContext) - - [EventContext.ExtensionsEntry](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.EventContext.ExtensionsEntry) - - [EventDependency](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.EventDependency) - - [FileArtifact](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.FileArtifact) - - [GroupVersionKind](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.GroupVersionKind) - - [NodeStatus](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.NodeStatus) - - [ResourceObject](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.ResourceObject) - - [ResourceObject.LabelsEntry](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.ResourceObject.LabelsEntry) - - [ResourceParameter](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.ResourceParameter) - - [ResourceParameterSource](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.ResourceParameterSource) - - [RetryStrategy](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.RetryStrategy) - - [S3Artifact](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.S3Artifact) - - [S3Bucket](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.S3Bucket) - - [S3Filter](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.S3Filter) - - [Sensor](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.Sensor) - - [SensorList](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.SensorList) - - [SensorSpec](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.SensorSpec) - - [SensorStatus](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.SensorStatus) - - [SensorStatus.NodesEntry](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.SensorStatus.NodesEntry) - - [SignalFilter](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.SignalFilter) - - [TimeFilter](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.TimeFilter) - - [Trigger](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.Trigger) - - [URI](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.URI) - - [URLArtifact](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.URLArtifact) - - - - - -- [Scalar Value Types](#scalar-value-types) - - - - -

Top

- -## github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1/generated.proto - - - - - -### ArtifactLocation -ArtifactLocation describes the source location for an external artifact - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| s3 | [S3Artifact](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.S3Artifact) | optional | | -| inline | [string](#string) | optional | | -| file | [FileArtifact](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.FileArtifact) | optional | | -| url | [URLArtifact](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.URLArtifact) | optional | | -| configmap | [ConfigmapArtifact](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.ConfigmapArtifact) | optional | | - - - - - - - - -### ConfigmapArtifact -ConfigmapArtifact contains information about artifact in k8 configmap - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| name | [string](#string) | optional | Name of the configmap | -| namespace | [string](#string) | optional | Namespace where configmap is deployed | -| key | [string](#string) | optional | Key within configmap data which contains trigger resource definition | - - - - - - - - -### Data - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| filters | [DataFilter](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.DataFilter) | repeated | filter constraints | -| escalationPolicy | [EscalationPolicy](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.EscalationPolicy) | optional | EscalationPolicy is the escalation to trigger in case the eventDependency filter fails | - - - - - - - - -### DataFilter -DataFilter describes constraints and filters for event data -Regular Expressions are purposefully not a feature as they are overkill for our uses here -See Rob Pike's Post: https://commandcenter.blogspot.com/2011/08/regular-expressions-in-lexing-and.html - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| path | [string](#string) | optional | Path is the JSONPath of the event's (JSON decoded) data key Path is a series of keys separated by a dot. A key may contain wildcard characters '*' and '?'. To access an array value use the index as the key. The dot and wildcard characters can be escaped with '\\'. See https://github.com/tidwall/gjson#path-syntax for more information on how to use this. | -| type | [string](#string) | optional | Type contains the JSON type of the data | -| value | [string](#string) | optional | Value is the expected string value for this key Booleans are pased using strconv.ParseBool() Numbers are parsed using as float64 using strconv.ParseFloat() Strings are taken as is Nils this value is ignored | -| escalationPolicy | [EscalationPolicy](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.EscalationPolicy) | optional | EscalationPolicy is the escalation to trigger in case the eventDependency filter fails | - - - - - - - - -### EscalationPolicy -EscalationPolicy describes the policy for escalating sensors in an Error state. -An escalation policy is associated with eventDependency filter. Whenever a eventDependency filter fails -escalation will be triggered - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| name | [string](#string) | optional | Name is name of the escalation policy This is referred by eventDependency filter/s | -| level | [string](#string) | optional | Level is the degree of importance | -| message | [string](#string) | optional | need someway to progressively get more serious notifications | - - - - - - - - -### Event -Event is a data record expressing an occurrence and its context. -Adheres to the CloudEvents v0.1 specification - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| context | [EventContext](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.EventContext) | optional | | -| data | [bytes](#bytes) | optional | | - - - - - - - - -### EventContext -EventContext contains metadata that provides circumstantial information about the occurrence. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| eventType | [string](#string) | optional | The type of occurrence which has happened. Often this attribute is used for routing, observability, policy enforcement, etc. should be prefixed with a reverse-DNS name. The prefixed domain dictates the organization which defines the semantics of this event type. ex: com.github.pull.create | -| eventTypeVersion | [string](#string) | optional | The version of the eventType. Enables the interpretation of data by eventual consumers, requires the consumer to be knowledgeable about the producer. | -| cloudEventsVersion | [string](#string) | optional | The version of the CloudEvents specification which the event uses. Enables the interpretation of the context. | -| source | [URI](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.URI) | optional | This describes the event producer. | -| eventID | [string](#string) | optional | ID of the event. The semantics are explicitly undefined to ease the implementation of producers. Enables deduplication. Must be unique within scope of producer. | -| eventTime | [k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime](#k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime) | optional | Timestamp of when the event happened. Must adhere to format specified in RFC 3339. +k8s:openapi-gen=false | -| schemaURL | [URI](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.URI) | optional | A link to the schema that the data attribute adheres to. Must adhere to the format specified in RFC 3986. | -| contentType | [string](#string) | optional | Content type of the data attribute value. Enables the data attribute to carry any type of content, whereby format and encoding might differ from that of the chosen event format. For example, the data attribute may carry an XML or JSON payload and the consumer is informed by this attribute being set to "application/xml" or "application/json" respectively. | -| extensions | [EventContext.ExtensionsEntry](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.EventContext.ExtensionsEntry) | repeated | This is for additional metadata and does not have a mandated structure. Enables a place for custom fields a producer or middleware might want to include and provides a place to test metadata before adding them to the CloudEvents specification. | -| escalationPolicy | [EscalationPolicy](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.EscalationPolicy) | optional | EscalationPolicy is the name of escalation policy to trigger in case the eventDependency filter fails | - - - - - - - - -### EventContext.ExtensionsEntry - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| key | [string](#string) | optional | | -| value | [string](#string) | optional | | - - - - - - - - -### EventDependency -EventDependency describes a dependency - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| name | [string](#string) | optional | Name is a unique name of this dependency | -| deadline | [int64](#int64) | optional | Deadline is the duration in seconds after the StartedAt time of the gateway after which this eventDependency is terminated. Note: this functionality is not yet respected, but it's theoretical behavior is as follows: This trumps the recurrence patterns of calendar signals and allows any eventDependency to have a strict defined life. After the deadline is reached and this eventDependency has not in a Resolved state, this eventDependency is marked as Failed and proper escalations should proceed. | -| filters | [SignalFilter](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.SignalFilter) | optional | Filters and rules governing tolerations of success and constraints on the context and data of an event | - - - - - - - - -### FileArtifact -FileArtifact contains information about an artifact in a filesystem - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| path | [string](#string) | optional | | - - - - - - - - -### GroupVersionKind -GroupVersionKind unambiguously identifies a kind. It doesn't anonymously include GroupVersion -to avoid automatic coercion. It doesn't use a GroupVersion to avoid custom marshalling. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| group | [string](#string) | optional | | -| version | [string](#string) | optional | | -| kind | [string](#string) | optional | | - - - - - - - - -### NodeStatus -NodeStatus describes the status for an individual node in the gateway's FSM. -A single node can represent the status for eventDependency or a trigger. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| id | [string](#string) | optional | ID is a unique identifier of a node within a gateway It is a hash of the node name | -| name | [string](#string) | optional | Name is a unique name in the node tree used to generate the node ID | -| displayName | [string](#string) | optional | DisplayName is the human readable representation of the node | -| type | [string](#string) | optional | Type is the type of the node | -| phase | [string](#string) | optional | Phase of the node | -| startedAt | [k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime](#k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime) | optional | StartedAt is the time at which this node started +k8s:openapi-gen=false | -| completedAt | [k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime](#k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime) | optional | CompletedAt is the time at which this node completed +k8s:openapi-gen=false | -| message | [string](#string) | optional | store data or something to save for eventDependency notifications or trigger events | -| latestEvent | [Event](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.Event) | optional | Event stores the last seen event for this node | - - - - - - - - -### ResourceObject -ResourceObject is the resource object to create on kubernetes - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| groupVersionKind | [GroupVersionKind](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.GroupVersionKind) | optional | The unambiguous kind of this object - used in order to retrieve the appropriate kubernetes api client for this resource | -| namespace | [string](#string) | optional | Namespace in which to create this object optional defaults to the service account namespace | -| source | [ArtifactLocation](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.ArtifactLocation) | optional | Source of the K8 resource file(s) | -| labels | [ResourceObject.LabelsEntry](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.ResourceObject.LabelsEntry) | repeated | Map of string keys and values that can be used to organize and categorize (scope and select) objects. This overrides any labels in the unstructured object with the same key. | -| parameters | [ResourceParameter](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.ResourceParameter) | repeated | Parameters is the list of resource parameters to pass in the object | - - - - - - - - -### ResourceObject.LabelsEntry - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| key | [string](#string) | optional | | -| value | [string](#string) | optional | | - - - - - - - - -### ResourceParameter -ResourceParameter indicates a passed parameter to a service template - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| src | [ResourceParameterSource](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.ResourceParameterSource) | optional | Src contains a source reference to the value of the resource parameter from a eventDependency event | -| dest | [string](#string) | optional | Dest is the JSONPath of a resource key. A path is a series of keys separated by a dot. The colon character can be escaped with '.' The -1 key can be used to append a value to an existing array. See https://github.com/tidwall/sjson#path-syntax for more information about how this is used. | - - - - - - - - -### ResourceParameterSource -ResourceParameterSource defines the source for a resource parameter from a eventDependency event - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| eventDependency | [string](#string) | optional | EventDependency is the name of the eventDependency for which to retrieve this event | -| path | [string](#string) | optional | Path is the JSONPath of the event's (JSON decoded) data key Path is a series of keys separated by a dot. A key may contain wildcard characters '*' and '?'. To access an array value use the index as the key. The dot and wildcard characters can be escaped with '\\'. See https://github.com/tidwall/gjson#path-syntax for more information on how to use this. | -| value | [string](#string) | optional | Value is the default literal value to use for this parameter source This is only used if the path is invalid. If the path is invalid and this is not defined, this param source will produce an error. | - - - - - - - - -### RetryStrategy -RetryStrategy represents a strategy for retrying operations -TODO: implement me - - - - - - - - -### S3Artifact -S3Artifact contains information about an artifact in S3 - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| s3Bucket | [S3Bucket](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.S3Bucket) | optional | | -| key | [string](#string) | optional | | -| event | [string](#string) | optional | | -| filter | [S3Filter](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.S3Filter) | optional | | - - - - - - - - -### S3Bucket -S3Bucket contains information for an S3 Bucket - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| endpoint | [string](#string) | optional | | -| bucket | [string](#string) | optional | | -| region | [string](#string) | optional | | -| insecure | [bool](#bool) | optional | | -| accessKey | [k8s.io.api.core.v1.SecretKeySelector](#k8s.io.api.core.v1.SecretKeySelector) | optional | +k8s:openapi-gen=false | -| secretKey | [k8s.io.api.core.v1.SecretKeySelector](#k8s.io.api.core.v1.SecretKeySelector) | optional | +k8s:openapi-gen=false | - - - - - - - - -### S3Filter -S3Filter represents filters to apply to bucket nofifications for specifying constraints on objects - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| prefix | [string](#string) | optional | | -| suffix | [string](#string) | optional | | - - - - - - - - -### Sensor -Sensor is the definition of a gateway resource -+genclient -+genclient:noStatus -+k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object -+k8s:openapi-gen=true - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| metadata | [k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta](#k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta) | optional | +k8s:openapi-gen=false | -| spec | [SensorSpec](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.SensorSpec) | optional | | -| status | [SensorStatus](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.SensorStatus) | optional | | - - - - - - - - -### SensorList -SensorList is the list of Sensor resources -+k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| metadata | [k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta](#k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta) | optional | +k8s:openapi-gen=false | -| items | [Sensor](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.Sensor) | repeated | | - - - - - - - - -### SensorSpec -SensorSpec represents desired gateway state - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| dependencies | [EventDependency](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.EventDependency) | repeated | EventDependency is a list of the events that this gateway is dependent on. | -| triggers | [Trigger](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.Trigger) | repeated | Triggers is a list of the things that this gateway evokes. These are the outputs from this gateway. | -| deploySpec | [k8s.io.api.core.v1.PodSpec](#k8s.io.api.core.v1.PodSpec) | optional | DeploySpec contains gateway pod specification. For more information, read https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.11/#pod-v1-core | - - - - - - - - -### SensorStatus -SensorStatus contains information about the status of a gateway. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| phase | [string](#string) | optional | Phase is the high-level summary of the gateway | -| startedAt | [k8s.io.apimachinery.pkg.apis.meta.v1.Time](#k8s.io.apimachinery.pkg.apis.meta.v1.Time) | optional | StartedAt is the time at which this gateway was initiated +k8s:openapi-gen=false | -| completedAt | [k8s.io.apimachinery.pkg.apis.meta.v1.Time](#k8s.io.apimachinery.pkg.apis.meta.v1.Time) | optional | CompletedAt is the time at which this gateway was completed +k8s:openapi-gen=false | -| completionCount | [int32](#int32) | optional | CompletionCount is the count of gateway's successful runs. | -| message | [string](#string) | optional | Message is a human readable string indicating details about a gateway in its phase | -| nodes | [SensorStatus.NodesEntry](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.SensorStatus.NodesEntry) | repeated | Nodes is a mapping between a node ID and the node's status it records the states for the FSM of this gateway. | - - - - - - - - -### SensorStatus.NodesEntry - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| key | [string](#string) | optional | | -| value | [NodeStatus](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.NodeStatus) | optional | | - - - - - - - - -### SignalFilter -SignalFilter defines filters and constraints for a eventDependency. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| name | [string](#string) | optional | Name is the name of eventDependency filter | -| time | [TimeFilter](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.TimeFilter) | optional | Time filter on the eventDependency with escalation | -| context | [EventContext](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.EventContext) | optional | Context filter constraints with escalation | -| data | [Data](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.Data) | optional | Data filter constraints with escalation | - - - - - - - - -### TimeFilter -TimeFilter describes a window in time. -Filters out eventDependency events that occur outside the time limits. -In other words, only events that occur after Start and before Stop -will pass this filter. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| start | [string](#string) | optional | Start is the beginning of a time window. Before this time, events for this eventDependency are ignored and format is hh:mm:ss | -| stop | [string](#string) | optional | StopPattern is the end of a time window. After this time, events for this eventDependency are ignored and format is hh:mm:ss | -| escalationPolicy | [EscalationPolicy](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.EscalationPolicy) | optional | EscalationPolicy is the escalation to trigger in case the eventDependency filter fails | - - - - - - - - -### Trigger -Trigger is an action taken, output produced, an event created, a message sent - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| name | [string](#string) | optional | Name is a unique name of the action to take | -| resource | [ResourceObject](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.ResourceObject) | optional | Resource describes the resource that will be created by this action | -| message | [string](#string) | optional | Message describes a message that will be sent on a queue | -| replyStrategy | [RetryStrategy](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.RetryStrategy) | optional | RetryStrategy is the strategy to retry a trigger if it fails | - - - - - - - - -### URI -URI is a Uniform Resource Identifier based on RFC 3986 - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| scheme | [string](#string) | optional | | -| user | [string](#string) | optional | | -| password | [string](#string) | optional | | -| host | [string](#string) | optional | | -| port | [int32](#int32) | optional | | -| path | [string](#string) | optional | | -| query | [string](#string) | optional | | -| fragment | [string](#string) | optional | | - - - - - - - - -### URLArtifact -URLArtifact contains information about an artifact at an http endpoint. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| path | [string](#string) | optional | | -| verifyCert | [bool](#bool) | optional | | - - - - - - - - - - - - - - - -## Scalar Value Types - -| .proto Type | Notes | C++ Type | Java Type | Python Type | -| ----------- | ----- | -------- | --------- | ----------- | -| double | | double | double | float | -| float | | float | float | float | -| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | -| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | -| uint32 | Uses variable-length encoding. | uint32 | int | int/long | -| uint64 | Uses variable-length encoding. | uint64 | long | int/long | -| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | -| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | -| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | -| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | -| sfixed32 | Always four bytes. | int32 | int | int | -| sfixed64 | Always eight bytes. | int64 | long | int/long | -| bool | | bool | boolean | boolean | -| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | -| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | - diff --git a/docs/trigger-guide.md b/docs/trigger-guide.md index 14688e9f6f..4bda075962 100644 --- a/docs/trigger-guide.md +++ b/docs/trigger-guide.md @@ -1,25 +1,12 @@ -# Trigger Guide +# Triggers Triggers are the sensor's actions. Triggers are only executed after all of the sensor's signals have been resolved. -The `resource` field in the trigger object has details of what to execute when the signals have been resolved. The `source` field in the `resource` object can have 3 types of values: - -- inline: -In this case, the workflow to execute as part of the trigger is inlined in the sensor yaml itself. E.g. [inline-sensor](https://github.com/argoproj/argo-events/blob/master/examples/sensors/inline-sensor.yaml) - -- file: -In this case, the workflow to execute is specified as a file-system path. This file-system path should exist in the sensor-controller deployment. The default sensor-controller does not have any volume mounts and therefore does not have any workflow yamls. If users are going to use this, they should explicitly mount appropriate volumes in the sensor-controller deployment. E.g. [file-sensor](https://github.com/argoproj/argo-events/blob/master/examples/sensors/file-sensor.yaml) - -- url: -In this case, the workflow to execute is specified as a url path. E.g. [url-sensor](https://github.com/argoproj/argo-events/blob/master/examples/sensors/url-sensor.yaml) - - +The `resource` field in the trigger object has details of what to execute when the signals have been resolved. Refer to https://github.com/argoproj/argo-events/blob/master/docs/artifact-guide.md ### Resource Object Resources define a YAML or JSON K8 resource. The set of currently resources supported are implemented in the `store` package. Adding support for new resources is as simple as including the type you want to create in the store's `decodeAndUnstructure()` method. We hope to change this functionality so that permissions for CRUD operations against certain resources can be controlled through RBAC roles instead. -List of currently supported K8 Resources: +List of currently supported custom K8 Resources: - Gateway - Sensor - [Workflow](https://github.com/argoproj/argo) -### Messages -Messages define content and a stream queue resource on which to send the content. \ No newline at end of file diff --git a/docs/tutorial.md b/docs/tutorial.md index fe3a9a5f67..a717db5c38 100644 --- a/docs/tutorial.md +++ b/docs/tutorial.md @@ -1,1040 +1,176 @@ # Guide -1. [What are sensor and gateway controllers](controllers-guide.md) +1. [Sensor and gateway controllers](controllers-guide.md) 2. [Learn about gateways](gateway-guide.md) 3. [Learn about sensors](sensor-guide.md) 4. [Learn about triggers](trigger-guide.md) -5. [Install gateways and sensors](#gands) +5. [Core Gateways Event Sources](#core-gateways-event-sources) 1. [Webhook](#webhook) 2. [Artifact](#artifact) 3. [Calendar](#calendar) 4. [Resource](#resource) 5. [Streams](#streams) - 1. [Nats](#nats) - 2. [Kafka](#kafka) - 3. [MQTT](#mqtt) - 4. [AMQP](#amqp) -6. [Updating gateway configurations dynamically](#updating-configurations) -7. [Passing payload from signal to trigger](#passing-payload-from-signal-to-trigger) -8. [Sensor filters](#sensor-filters) -9. [Writing custom gateways](custom-gateway.md) - -## Install gateways and sensors - -## Webhook - -Webhook gateway is useful when you want to listen to an incoming HTTP request and forward that event to watchers. - -1)
Let's have a look at the configuration for our gateway.
+6. [Sensor filters](#sensor-filters) +7. [Write your own gateway](custom-gateway.md) + +## Core Gateways Event Sources +Event source name can be any valid string. + +### Webhook +Webhook gateway listens to incoming HTTP requests. + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: webhook-gateway-configmap +data: + # each event source defines - + # the port for HTTP server + # endpoint to listen to + # acceptable http method + bar: |- + port: "12000" + endpoint: "/bar" + method: "POST" + foo: |- + port: "12000" + endpoint: "/foo" + method: "POST" +``` + +## Artifact +Artifact gateway listens to minio bucket notifications. +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: artifact-gateway-configmap +data: + input: |- + bucket: + name: input # name of the bucket we want to listen to + endpoint: minio-service.argo-events:9000 # minio service endpoint + event: s3:ObjectCreated:Put # type of event + filter: # filter on object name if any + prefix: "" + suffix: "" + insecure: true # type of minio server deployment + accessKey: + key: accesskey # key within below k8 secret whose corresponding value is name of the accessKey + name: artifacts-minio # k8 secret name that holds minio creds + secretKey: + key: secretkey # key within below k8 secret whose corresponding value is name of the secretKey + name: artifacts-minio # k8 secret name that holds minio creds +``` + +## Calendar +Calendar gateway either accepts `interval` and `cron schedules` as event source. +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: calendar-gateway-configmap +data: + interval: |- + interval: 10s # event is generated after every 10 seconds + schedule: |- + schedule: 30 * * * * # event is generated after 30 min past every hour +``` + +## Resource +Resource gateway can monitor any K8 resource and any CRD. +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: resource-gateway-configmap +data: + successWorkflow: |- + namespace: argo-events # namespace where wf is deloyef + group: "argoproj.io" # wf group + version: "v1alpha1" # wf version + kind: "Workflow" # object kind + filter: # filters can be applied on labels, annotations, creation time and name + labels: + workflows.argoproj.io/phase: Succeeded + name: "my-workflow" + failureWorkflow: |- + namespace: argo-events + group: "argoproj.io" + version: "v1alpha1" + kind: "Workflow" + filter: + prefix: scripts-bash + labels: + workflows.argoproj.io/phase: Failed +``` - ```yaml +## Streams + * **NATS**: + ```yaml apiVersion: v1 kind: ConfigMap metadata: - name: webhook-gateway-configmap + name: nats-gateway-configmap data: - # run http server on 12000 - webhook.portConfig: |- - port: "12000" - # listen to /bar endpoint for POST requests - webhook.barConfig: |- - endpoint: "/bar" - method: "POST" - # listen to /foo endpoint for POST requests - webhook.fooConfig: |- - endpoint: "/foo" - method: "POST" - ``` - - 1) This configmap contains multiple configurations. First configuration describes on which port HTTP server should run. Currently, the gateway - can only start one HTTP server and all endpoints will be registered with this server. But in future, we plan to add support to - spin up multiple HTTP servers and give ability to user to register endpoints to different servers. - - 2) Second configuration describes an endpoint called `/bar` that will be registered with HTTP server. The `method` describes which HTTP method - is allowed for a request. In this case only incoming HTTP POST requests will be accepted on `/bar`. - - 3) Third configuration has endpoint `/foo` and accepts requests with method POST. - -
Lets go ahead and create above configmap,
- - ```bash - kubectl create -n argo-events -f https://raw.githubusercontent.com/argoproj/argo-events/master/examples/gateways/webhook-gateway-configmap.yaml - ``` - - ```bash - # Make sure that configmap is created in `argo-events` namespace - - kubectl -n argo-events get configmaps webhook-gateway-configmap - ``` - -2)
Next step is to create the webhook gateway,
- - 1. Gateway definition, - ```yaml - apiVersion: argoproj.io/v1alpha1 - kind: Gateway - metadata: - # name of the gateway - name: webhook-gateway - labels: - # must match with instance id of one of the gateway controllers. - gateways.argoproj.io/gateway-controller-instanceid: argo-events - gateway-name: "webhook-gateway" - spec: - # configmap to read configurations from - configMap: "webhook-gateway-configmap" - # type of gateway - type: "webhook" - # event dispatch protocol between gateway and it's watchers - dispatchMechanism: "HTTP" - # version of events this gateway is generating. Required for cloudevents specification - version: "1.0" - # these are pod specifications - deploySpec: - containers: - - name: "webhook-events" - image: "argoproj/webhook-gateway" - imagePullPolicy: "Always" - command: ["/bin/webhook-gateway"] - serviceAccountName: "argo-events-sa" - # service specifications to expose gateway - serviceSpec: - selector: - gateway-name: "webhook-gateway" - ports: - - port: 12000 - targetPort: 12000 - type: LoadBalancer - # watchers are components interested in listening to events produced by this gateway - watchers: - sensors: - - name: "webhook-sensor" - ``` - - 2. Run following command, - ```bash - kubectl create -n argo-events -f https://raw.githubusercontent.com/argoproj/argo-events/master/examples/gateways/webhook.yaml - ``` - - 3. Check all gateway configurations are in `running` state - ```bash - kubectl get -n argo-events gateways webhook-gateway -o yaml - ``` - -3)
Now its time to create webhook sensor.
- 1. Sensor definition, - - ```yaml - apiVersion: argoproj.io/v1alpha1 - kind: Sensor - metadata: - # name of sensor - name: webhook-sensor - labels: - # instance-id must match with one of the deployed sensor controller's instance-id - sensors.argoproj.io/sensor-controller-instanceid: argo-events - spec: - # make this sensor as long running. - repeat: true - serviceAccountName: argo-events-sa - # signals/notifications this sensor is interested in. - signals: - # event must be from webhook-gateway and the configuration that produced this event must be - # webhook.fooConfig - - name: webhook-gateway/webhook.fooConfig - triggers: - - name: webhook-workflow-trigger - resource: - namespace: argo-events - group: argoproj.io - version: v1alpha1 - kind: Workflow - source: - inline: | - apiVersion: argoproj.io/v1alpha1 - kind: Workflow - metadata: - generateName: hello-world- - spec: - entrypoint: whalesay - templates: - - name: whalesay - container: - args: - - "hello world" - command: - - cowsay - image: "docker/whalesay:latest" - ``` - - This sensor defines only one signal called `webhook-gateway/webhook.fooConfig`, meaning, it is interested in listening - events from `webhook.fooConfig` configuration within `webhook-gateway` gateway. - - 2. Run following command, - ```bash - kubectl create -f https://raw.githubusercontent.com/argoproj/argo-events/master/examples/sensors/webhook.yaml - ``` - - 3. Check whether all sensor nodes are initialized, - ```bash - kubectl get -n argo-events sensors webhook-sensor - ``` - - 4. Get the service url for gateway, - ```bash - minikube service --url webhook-gateway-gateway-svc - ``` - - 5. If you face issue getting service url from executing above command, you can use `kubectl port-forward` - 1. Open another terminal window and enter `kubectl port-forward 9003:` - 2. You can now user `localhost:9003` to query webhook gateway - - 6. Send a POST request to the gateway service, and monitor namespace for new workflow - ```bash - curl -d '{"message":"this is my first webhook"}' -H "Content-Type: application/json" -X POST /foo - ``` - - 7. List argo workflows - ```bash - argo -n argo-events list - ``` - -
- -## Artifact -Currently framework supports Minio S3 storage for artifact gateway but we plan to add File System and AWS/GCP S3 gateways in future. - -Lets start with deploying Minio server standalone deployment. You can get the K8 deployment from https://www.minio.io/kubernetes.html + foo: |- + url: nats://nats.argo-events:4222 # nats service + subject: foo # subject to listen to + ``` - 1. Minio deployment, store it in `minio-deployment.yaml` - ```yaml - apiVersion: v1 - kind: PersistentVolumeClaim - metadata: - # This name uniquely identifies the PVC. Will be used in deployment below. - name: minio-pv-claim - labels: - app: minio-storage-claim - spec: - # Read more about access modes here: http://kubernetes.io/docs/user-guide/persistent-volumes/#access-modes - accessModes: - - ReadWriteOnce - resources: - # This is the request for storage. Should be available in the cluster. - requests: - storage: 10Gi - # Uncomment and add storageClass specific to your requirements below. Read more https://kubernetes.io/docs/concepts/storage/persistent-volumes/#class-1 - #storageClassName: - --- - apiVersion: extensions/v1beta1 - kind: Deployment - metadata: - # This name uniquely identifies the Deployment - name: minio-deployment - spec: - strategy: - type: Recreate - template: - metadata: - labels: - # Label is used as selector in the service. - app: minio - spec: - # Refer to the PVC created earlier - volumes: - - name: storage - persistentVolumeClaim: - # Name of the PVC created earlier - claimName: minio-pv-claim - containers: - - name: minio - # Pulls the default Minio image from Docker Hub - image: minio/minio - args: - - server - - /storage - env: - # Minio access key and secret key - - name: MINIO_ACCESS_KEY - value: "myaccess" - - name: MINIO_SECRET_KEY - value: "mysecret" - ports: - - containerPort: 9000 - # Mount the volume into the pod - volumeMounts: - - name: storage # must match the volume name, above - mountPath: "/storage" - --- - apiVersion: v1 - kind: Service - metadata: - name: minio-service - spec: - type: LoadBalancer - ports: - - port: 9000 - targetPort: 9000 - protocol: TCP - selector: - app: minio - - ``` - - 2. Install minio, - ```bash - kubectl create -n argo-events -f minio-deployment.yaml - ``` - - 3. Create the configuration, - ```yaml - apiVersion: v1 - kind: ConfigMap - metadata: - name: artifact-gateway-configmap - data: - s3.fooConfig: |- - s3EventConfig: - bucket: input # name of the bucket we want to listen to - endpoint: minio-service.argo-events:9000 # minio service endpoint - event: s3:ObjectCreated:Put # type of event - filter: # filter on object name if any - prefix: "" - suffix: "" - insecure: true # type of minio server deployment - accessKey: - key: accesskey # key within below k8 secret whose corresponding value is name of the accessKey - name: artifacts-minio # k8 secret name that holds minio creds - secretKey: - key: secretkey # key within below k8 secret whose corresponding value is name of the secretKey - name: artifacts-minio # k8 secret name that holds minio creds - ``` - - Read comments on configmap to understand more about each field in configuration - - Run, - ```bash - kubectl create -n argo-events -f https://raw.githubusercontent.com/argoproj/argo-events/master/examples/gateways/artifact-gateway-configmap.yaml - ``` - - 4. Artifact gateway definition, - ```yaml - apiVersion: argoproj.io/v1alpha1 - kind: Gateway - metadata: - name: artifact-gateway - labels: - gateways.argoproj.io/gateway-controller-instanceid: argo-events - gateway-name: "artifact-gateway" - spec: - deploySpec: - containers: - - name: "artifact-events" - image: "argoproj/artifact-gateway" - imagePullPolicy: "Always" - command: ["/bin/artifact-gateway"] - serviceAccountName: "argo-events-sa" - configMap: "artifact-gateway-configmap" - version: "1.0" - type: "artifact" - dispatchMechanism: "HTTP" - watchers: - sensors: - - name: "artifact-sensor" - ``` - - Execute following command to create artifact gateway, - ```bash - kubectl -n argo-events create -f https://raw.githubusercontent.com/argoproj/argo-events/master/examples/gateways/artifact.yaml - ``` - - 5. Check whether all gateway configurations are active, - ```bash - kubectl -n argo-events get gateways artifact-gateway -o yaml - ``` - - 6. Below is the sensor definition, - ```yaml - apiVersion: argoproj.io/v1alpha1 - kind: Sensor - metadata: - name: artifact-sensor - labels: - sensors.argoproj.io/sensor-controller-instanceid: argo-events - spec: - repeat: true - serviceAccountName: argo-events-sa - signals: - - name: artifact-gateway/s3.fooConfig - triggers: - - name: artifact-workflow-trigger - resource: - namespace: argo-events - group: argoproj.io - version: v1alpha1 - kind: Workflow - source: - inline: | - apiVersion: argoproj.io/v1alpha1 - kind: Workflow - metadata: - generateName: hello-world- - spec: - entrypoint: whalesay - templates: - - - container: - args: - - "hello world" - command: - - cowsay - image: "docker/whalesay:latest" - name: whalesay - ``` - - Run, - ```bash - kubectl -n argo-events create -f https://raw.githubusercontent.com/argoproj/argo-events/trigger-param-fix/examples/sensors/s3.yaml - ``` - - Check that all signals and triggers are intialized, - ```bash - kubectl -n argo-events get sensors artifact-sensor -o yaml - ``` - - 7. Drop a file into `input` bucket and monitor namespace for argo workflow. - ```bash - argo -n argo-events list - ``` - -
- -## Calendar -Calendar gateway either accepts `interval` or `cron schedules` as configuration. - - 1. Lets have a look at configuration, - ```bash + * **KAFKA**: + ```yaml apiVersion: v1 kind: ConfigMap metadata: - name: calendar-gateway-configmap + name: kafka-gateway-configmap data: - calendar.barConfig: |- - interval: 10s - calendar.fooConfig: |- - schedule: 30 * * * * - ``` - - The `barConfig` defines an interval of `10s`, meaning, gateway configuration will run every 10s and send event to watchers. - The `fooConfig` defines a cron schedule `30 * * * *` meaning, gateway configuration will run every 30 min and send event to watchers. - - Run, - ```bash - kubectl -n argo-events create -f https://raw.githubusercontent.com/argoproj/argo-events/master/examples/gateways/calendar-gateway-configmap.yaml - ``` - - 2. Gateway definition, - ```yaml - apiVersion: argoproj.io/v1alpha1 - kind: Gateway - metadata: - name: calendar-gateway - labels: - gateways.argoproj.io/gateway-controller-instanceid: argo-events - gateway-name: "calendar-gateway" - spec: - deploySpec: - containers: - - name: "calendar-events" - image: "argoproj/calendar-gateway" - imagePullPolicy: "Always" - command: ["/bin/calendar-gateway"] - serviceAccountName: "argo-events-sa" - configMap: "calendar-gateway-configmap" - type: "calendar" - dispatchMechanism: "HTTP" - version: "1.0" - watchers: - sensors: - - name: "calendar-sensor" - ``` - - Run, - ```bash - kubectl -n argo-events create -f https://raw.githubusercontent.com/argoproj/argo-events/master/examples/gateways/calendar.yaml - ``` - - Check all configurations are active, - ```bash - kubectl -n argo-events get gateways calendar-gateway -o yaml - ``` - - 3. Sensor definition, - ```yaml - apiVersion: argoproj.io/v1alpha1 - kind: Sensor - metadata: - name: calendar-sensor - labels: - sensors.argoproj.io/sensor-controller-instanceid: argo-events - spec: - serviceAccountName: argo-events-sa - imagePullPolicy: Always - repeat: true - signals: - - name: calendar-gateway/calendar.fooConfig - triggers: - - name: calendar-workflow-trigger - resource: - namespace: argo-events - group: argoproj.io - version: v1alpha1 - kind: Workflow - source: - inline: | - apiVersion: argoproj.io/v1alpha1 - kind: Workflow - metadata: - generateName: hello-world- - spec: - entrypoint: whalesay - templates: - - - container: - args: - - "hello world" - command: - - cowsay - image: "docker/whalesay:latest" - name: whalesay - ``` - - Run, - ```bash - kubectl -n argo-events create -f https://raw.githubusercontent.com/argoproj/argo-events/master/examples/sensors/calendar.yaml - ``` - - 4. List workflows, - ```bash - argo -n argo-events list - ``` - -
- -## Resource -Resource gateway can monitor any K8 resource and any CRD. - - 1. Lets have a look at a configuration, - ```yaml + foo: |- + url: kafka.argo-events:9092 # kafka service + topic: foo # topic name + partition: "0" # topic partition + bar: |- + url: kafka.argo-events:9092 + topic: bar + partition: "1" + ``` + + + * **MQTT**: + ```yaml apiVersion: v1 kind: ConfigMap metadata: - name: resource-gateway-configmap + name: mqtt-gateway-configmap data: - resource.fooConfig: |- - namespace: argo-events - group: "argoproj.io" - version: "v1alpha1" - kind: "Workflow" - filter: - labels: - workflows.argoproj.io/phase: Succeeded - name: "my-workflow" - resource.barConfig: |- - namespace: argo-events - group: "argoproj.io" - version: "v1alpha1" - kind: "Workflow" - filter: - prefix: scripts-bash - labels: - workflows.argoproj.io/phase: Failed - ``` - - * In configuration `resource.fooConfig`, gateway will watch resource of type `Workflow` which is K8 CRD. Whenever a - workflow with name `my-workflow` is assigned label `workflows.argoproj.io/phase: Succeeded`, the configuration will - send an event to watchers. - - * Gateway configuration `resource.barConfig` will send event to watchers whenever a sensor label `workflows.argoproj.io/phase: Failed` is added. - - * You can create more such configurations that watch namespace, configmaps, deployments, pods etc. - - Run, - ```bash - kubectl -n argo-events create -f https://raw.githubusercontent.com/argoproj/argo-events/master/examples/gateways/resource-gateway-configmap.yaml - ``` - - 2. Gateway definition, - ```yaml - apiVersion: argoproj.io/v1alpha1 - kind: Gateway - metadata: - name: resource-gateway - labels: - gateways.argoproj.io/gateway-controller-instanceid: argo-events - gateway-name: "resource-gateway" - spec: - deploySpec: - containers: - - name: "resource-events" - image: "argoproj/resource-gateway" - imagePullPolicy: "Always" - command: ["/bin/resource-gateway"] - serviceAccountName: "argo-events-sa" - configMap: "resource-gateway-configmap" - type: "resource" - dispatchMechanism: "HTTP" - version: "1.0" - watchers: - sensors: - - name: "resource-sensor" - ``` - - Run, - ```bash - kubectl -n argo-events create -f https://raw.githubusercontent.com/argoproj/argo-events/master/examples/gateways/resource.yaml - ``` - - Check all configurations are active, - ```bash - kubectl -n argo-events get gateways resource-gateway -o yaml - ``` - - 3. Sensor definition, - ```yaml - apiVersion: argoproj.io/v1alpha1 - kind: Sensor - metadata: - name: resource-sensor - labels: - sensors.argoproj.io/sensor-controller-instanceid: argo-events - spec: - repeat: true - serviceAccountName: argo-events-sa - signals: - - name: resource-gateway/resource.fooConfig - triggers: - - name: argo-workflow - resource: - namespace: argo-events - group: argoproj.io - version: v1alpha1 - kind: Workflow - source: - inline: | - apiVersion: argoproj.io/v1alpha1 - kind: Workflow - metadata: - generateName: hello-world- - spec: - entrypoint: whalesay - templates: - - - container: - args: - - "hello world" - command: - - cowsay - image: "docker/whalesay:latest" - name: whalesay - - ``` - - Run, - ```bash - kubectl -n argo-events create -f https://raw.githubusercontent.com/argoproj/argo-events/master/examples/sensors/resource.yaml - ``` - - 4. Create an basic `hello-world` argo workflow with name `my-workflow`. - ```yaml - apiVersion: argoproj.io/v1alpha1 - kind: Workflow - metadata: - generateName: hello-world- - namespace: argo-events - labels: - name: my-workflow - spec: - entrypoint: whalesay - serviceAccountName: argo-events-sa - templates: - - container: - args: - - "hello world" - command: - - cowsay - image: docker/whalesay:latest - name: whalesay - ``` - Run - ```bash - kubectl -n argo-events -f https://raw.githubusercontent.com/argoproj/argo/master/examples/hello-world.yaml - ``` - - Once workflow is created, resource sensor will trigger workflow. - - 5. Run `argo -n argo-events list` + foo: |- + url: tcp://mqtt.argo-events:1883 # mqtt service + topic: foo # topic to listen to + bar: |- + url: tcp://mqtt.argo-events:1883 + topic: bar -
- -## Streams - * ### NATS - Lets start by installing a NATS cluster - - 1) Store following NATS deployment in nats-deploy.yaml - ```yaml - apiVersion: v1 - kind: Service - metadata: - name: nats - namespace: argo-events - labels: - component: nats - spec: - selector: - component: nats - type: ClusterIP - ports: - - name: client - port: 4222 - - name: cluster - port: 6222 - - name: monitor - port: 8222 - --- - apiVersion: apps/v1beta1 - kind: StatefulSet - metadata: - name: nats - namespace: argo-events - labels: - component: nats - spec: - serviceName: nats - replicas: 1 - template: - metadata: - labels: - component: nats - spec: - serviceAccountName: argo-events-sa - containers: - - name: nats - image: nats:latest - ports: - - containerPort: 4222 - name: client - - containerPort: 6222 - name: cluster - - containerPort: 8222 - name: monitor - livenessProbe: - httpGet: - path: / - port: 8222 - initialDelaySeconds: 10 - timeoutSeconds: 5 - ``` - Run, - ```bash - kubectl -n argo-events create -f nats-deploy.yaml - ``` - - 2) Once all pods are up and running, create gateway configmap, - ```bash - kubectl -n argo-events create -f https://raw.githubusercontent.com/argoproj/argo-events/master/examples/gateways/nats-gateway-configmap.yaml - ``` - - 3) Lets create a sensor, - ```bash - kubectl -n argo-events create -f https://raw.githubusercontent.com/argoproj/argo-events/master/examples/sensors/nats.yaml - ``` - - 4) Lets create gateway, - ```bash - kubectl -n argo-events create -f https://raw.githubusercontent.com/argoproj/argo-events/master/examples/gateways/nats.yaml - ``` - 5) Use nats client to publish message to subject. To install NATS client, head to [go-nats](https://github.com/nats-io/go-nats) - - 6) Once you publish message to a subject the gateway is configured to listen, you will see the argo workflow getting created. - - * ### Kafka - 1) If you don't already have a Kafka cluster running, follow the [kafka setup](https://github.com/helm/charts/tree/master/incubator/kafka) - - 2) Lets create the configuration for gateway, - ```bash - kubectl -n argo-events create -f https://raw.githubusercontent.com/argoproj/argo-events/master/examples/gateways/kafka-gateway-configmap.yaml - ``` - - 3) Once above configmap is created, lets deploy the gateway, - ```bash - kubectl -n argo-events create -f https://raw.githubusercontent.com/argoproj/argo-events/master/examples/gateways/kafka.yaml - ``` - - 4) To create sensor, run - ```bash - kubectl -n argo-events create -f https://raw.githubusercontent.com/argoproj/argo-events/master/examples/sensors/kafka.yaml - ``` - - 5) Publish a message to a topic and partition the gateway is configured to listen, you will see the argo workflow getting created. - - * ### MQTT - 1) If you don't have MQTT broker installed, use `Mosquitto`. - - Deployment, - ```yaml - apiVersion: extensions/v1beta1 - kind: Deployment - metadata: - name: mosquitto - namespace: argo-events - spec: - template: - spec: - serviceAccountName: argo-events-sa - containers: - - name: mosquitto - image: toke/mosquitto - ports: - - containerPort: 9001 - - containerPort: 8883 - ``` - - Service, - ```yaml - apiVersion: v1 - kind: Service - metadata: - name: mqtt - namespace: argo-events - spec: - ports: - - name: mosquitto - port: 1883 - - name: mosquitto-web - port: 80 - targetPort: 9001 - ``` - - 2. Create the gateway configuration, - ```bash - kubectl -n argo-events create -f https://raw.githubusercontent.com/argoproj/argo-events/master/examples/gateways/mqtt-gateway-configmap.yaml - ``` - - 3. Deploy the gateway, - ```bash - kubectl -n argo-events create -f https://raw.githubusercontent.com/argoproj/argo-events/master/examples/gateway/mqtt-gateway.yaml - ``` - - 4. Deploy the sensor, - ```bash - kubectl -n argo-events create -f https://raw.githubusercontent.com/argoproj/argo-events/master/examples/sensors/mqtt-sensor.yaml - ``` - - 5. Send a message to correct topic the gateway is configured to listen, you will see the argo workflow getting created. - - * ### AMQP - 1) If you haven't already setup rabbitmq cluster, follow [rabbitmq setup](https://github.com/binarin/rabbit-on-k8s-standalone) - - 2) Create gateway configuration, - ```bash - kubectl -n argo-events create -f https://raw.githubusercontent.com/argoproj/argo-events/master/examples/gateways/amqp-gateway-configmap.yaml - ``` - - 3) Deploy gateway, - ```bash - kubectl -n argo-events create -f https://raw.githubusercontent.com/argoproj/argo-events/master/examples/gateways/amqp.yaml - ``` - - 4) Deploy sensor, - ```bash - kubectl -n argo-events create -f https://raw.githubusercontent.com/argoproj/argo-events/master/examples/sensors/amqp.yaml - ``` - - 5) Send a message to exchange name the gateway is configured to listen, you will see the argo workflow getting created. - - -
- -## Updating gateway configurations dynamically - The framework offers ability to add and remove configurations for gateway on the fly. - Lets look at an example of webhook gateway. You already have three configurations running in gateway, - `webhook.portConfig`, `webhook.fooConfig` and `webhook.barConfig` - - 1) Lets add a new configuration to gateway configmap. Update configmap looks like, - ```yaml - apiVersion: v1 - kind: ConfigMap - metadata: - name: webhook-gateway-configmap - data: - webhook.portConfig: |- - port: "12000" - webhook.barConfig: |- - endpoint: "/bar" - method: "POST" - webhook.fooConfig: |- - endpoint: "/foo" - method: "POST" - webhook.myNewConfig: |- - endpoint: "/my" - method: "POST" - ``` - Run `kubectl -n argo-events apply -f configmap-file-name` on gateway configmap to update the configmap resource. - - 2) Run `kubectl -n argo-events get gateways webhook-gateway -o yaml`, you'll see gateway now has `webhook.myNewConfig` running. - - 3) Update the webhook sensor or create a new sensor to listen to this new configuration. - - 4) Test the endpoint by firing a HTTP POST request to `/my`. - - 5) Now, lets remove the configuration `webhook.myNewConfig` from gateway configmap. Run `kubectl apply` to update the configmap. - - 6) Check the gateway resource, `kubectl -n argo-events get gateways webhook-gateway -o yaml`. You will see `webhook.myNewConfig` is removed from the gateway. - - 7) Try sending a POST request to '/my' and server will respond with 404. - -
- -## Passing payload from signal to trigger - - * ### Complete payload - - 1. Create a webhook sensor, - ```yaml - apiVersion: argoproj.io/v1alpha1 - kind: Sensor - metadata: - name: webhook-with-resource-param-sensor - labels: - sensors.argoproj.io/sensor-controller-instanceid: argo-events - spec: - repeat: true - serviceAccountName: argo-events-sa - signals: - - name: webhook-gateway/webhook.fooConfig - triggers: - - name: argo-workflow - resource: - namespace: argo-events - group: argoproj.io - version: v1alpha1 - kind: Workflow - parameters: - - src: - signal: webhook-gateway/webhook.fooConfig - # pass payload of webhook-gateway/webhook.fooConfig signal to first parameter value - # of arguments. - dest: spec.arguments.parameters.0.value - source: - inline: | - apiVersion: argoproj.io/v1alpha1 - kind: Workflow - metadata: - name: arguments-via-webhook-event - spec: - entrypoint: whalesay - arguments: - parameters: - - name: message - # this is the value that should be overridden - value: hello world - templates: - - name: whalesay - inputs: - parameters: - - name: message - container: - image: docker/whalesay:latest - command: [cowsay] - args: ["{{inputs.parameters.message}}"] - ``` - - Run, - ```bash - kubectl create -f https://raw.githubusercontent.com/argoproj/argo-events/trigger-param-fix/examples/sensors/webhook-with-complete-payload.yaml - ``` - - 2. Note that sensor name is `webhook-with-resource-param-sensor`. Update your gateway accordingly or create a new one. - - 3. Send a POST request to your webhook gateway - ```bash - curl -d '{"message":"this is my first webhook"}' -H "Content-Type: application/json" -X POST $WEBHOOK_SERVICE_URL/foo - ``` - - 4. List argo workflows, - ```bash - argo -n argo-events list - ``` - - 5. Check the workflow logs using `argo -n argo-events logs ` - - - ## Filter event payload - 1. Create a webhook sensor, - ```yaml - apiVersion: argoproj.io/v1alpha1 - kind: Sensor + ``` + + * **AMQP** + ```yaml + apiVersion: v1 + kind: ConfigMap metadata: - name: webhook-with-resource-param-sensor - labels: - sensors.argoproj.io/sensor-controller-instanceid: argo-events - spec: - repeat: true - serviceAccountName: argo-events-sa - signals: - - name: webhook-gateway/webhook.fooConfig - triggers: - - name: argo-workflow - resource: - namespace: argo-events - group: argoproj.io - version: v1alpha1 - kind: Workflow - # The parameters from the workflow are overridden by the webhook's message - parameters: - - src: - signal: webhook-gateway/webhook.fooConfig - # extract the object corresponding to `message` key from event payload - # of webhook-gateway/webhook.fooConfig signal - path: message - # if `message` key doesn't exists in event payload then default value of payload - # passed to trigger will be `hello default` - value: hello default - # override the value of first parameter in arguments with above payload. - dest: spec.arguments.parameters.0.value - source: - inline: | - apiVersion: argoproj.io/v1alpha1 - kind: Workflow - metadata: - name: arguments-via-webhook-event - spec: - entrypoint: whalesay - arguments: - parameters: - - name: message - # this is the value that should be overridden - value: hello world - templates: - - name: whalesay - inputs: - parameters: - - name: message - container: - image: docker/whalesay:latest - command: [cowsay] - args: ["{{inputs.parameters.message}}"] - - ``` - 2. Run, - ```bash - kubectl apply -f https://raw.githubusercontent.com/argoproj/argo-events/trigger-param-fix/examples/sensors/webhook-with-resource-param.yaml - ``` - - 3. Post request to webhook gateway and watch new workflow being created - -
+ name: amqp-gateway-configmap + data: + foo: |- + url: amqp://amqp.argo-events:5672 + exchangeName: foo + exchangeType: fanout + routingKey: fooK + bar: |- + url: amqp://amqp.argo-events:5672 + exchangeName: bar + exchangeType: fanout + routingKey: barK + ``` ## Sensor Filters Following are the types of the filter you can apply on signal/event payload, diff --git a/examples/gateways/amqp.yaml b/examples/gateways/amqp.yaml index 6ab7db9b16..e6c767a338 100644 --- a/examples/gateways/amqp.yaml +++ b/examples/gateways/amqp.yaml @@ -6,18 +6,30 @@ metadata: gateways.argoproj.io/gateway-controller-instanceid: argo-events gateway-name: "amqp-gateway" spec: + processorPort: "9330" + eventProtocol: + type: "HTTP" + http: + port: "9300" deploySpec: - containers: - - name: amqp-events - image: "argoproj/amqp-gateway" - imagePullPolicy: "Always" - command: ["/bin/amqp-gateway"] - serviceAccountName: "argo-events-sa" + metadata: + name: "amqp-gateway" + labels: + gateway-name: "amqp-gateway" + spec: + containers: + - name: "gateway-client" + image: "argoproj/gateway-client" + imagePullPolicy: "Always" + command: ["/bin/gateway-client"] + - name: amqp-events + image: "argoproj/amqp-gateway" + imagePullPolicy: "Always" + command: ["/bin/amqp-gateway"] + serviceAccountName: "argo-events-sa" configMap: "amqp-gateway-configmap" type: "amqp" - dispatchMechanism: "HTTP" eventVersion: "1.0" - imageVersion: "latest" watchers: sensors: - name: "amqp-sensor" diff --git a/examples/gateways/artifact-gateway-configmap.yaml b/examples/gateways/artifact-gateway-configmap.yaml index da5a3f5fa4..264148fada 100644 --- a/examples/gateways/artifact-gateway-configmap.yaml +++ b/examples/gateways/artifact-gateway-configmap.yaml @@ -4,13 +4,13 @@ metadata: name: artifact-gateway-configmap data: input: |- - s3EventConfig: - bucket: input - endpoint: minio-service.argo-events:9000 - event: s3:ObjectCreated:Put - filter: - prefix: "" - suffix: "" + bucket: + name: input + endpoint: minio-service.argo-events:9000 + event: s3:ObjectCreated:Put + filter: + prefix: "" + suffix: "" insecure: true accessKey: key: accesskey diff --git a/examples/gateways/artifact-http.yaml b/examples/gateways/artifact-http.yaml new file mode 100644 index 0000000000..dae3234937 --- /dev/null +++ b/examples/gateways/artifact-http.yaml @@ -0,0 +1,36 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Gateway +metadata: + name: artifact-gateway + labels: + gateways.argoproj.io/gateway-controller-instanceid: argo-events + gateway-name: "artifact-gateway" +spec: + processorPort: "9330" + eventProtocol: + type: "HTTP" + http: + port: "9300" + deploySpec: + metadata: + name: "artifact-gateway" + labels: + gateway-name: "artifact-gateway" + spec: + containers: + - name: "gateway-client" + image: "argoproj/gateway-client" + imagePullPolicy: "Always" + command: ["/bin/gateway-client"] + - name: "artifact-events" + image: "argoproj/artifact-gateway" + imagePullPolicy: "Always" + command: ["/bin/artifact-gateway"] + serviceAccountName: "argo-events-sa" + configMap: "artifact-gateway-configmap" + eventVersion: "1.0" + type: "artifact" + watchers: + sensors: + - name: "artifact-sensor" + - name: "artifact-with-param-sensor" diff --git a/examples/gateways/artifact-nats-standard.yaml b/examples/gateways/artifact-nats-standard.yaml new file mode 100644 index 0000000000..5483e407d5 --- /dev/null +++ b/examples/gateways/artifact-nats-standard.yaml @@ -0,0 +1,33 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Gateway +metadata: + name: artifact-gateway-nats-standard + labels: + gateways.argoproj.io/gateway-controller-instanceid: argo-events + gateway-name: "artifact-gateway-nats-standard" +spec: + processorPort: "9330" + dispatchProtocol: + type: "NATS" + nats: + url: "nats://example-nats.argo-events:4222" + type: "Standard" + deploySpec: + metadata: + name: "artifact-gateway-nats-standard" + labels: + gateway-name: "artifact-gateway-nats-standard" + spec: + containers: + - name: "gateway-client" + image: "argoproj/gateway-client" + imagePullPolicy: "Always" + command: ["/bin/gateway-client"] + - name: "artifact-events" + image: "argoproj/artifact-gateway" + imagePullPolicy: "Always" + command: ["/bin/artifact-gateway"] + serviceAccountName: "argo-events-sa" + configMap: "artifact-gateway-configmap" + eventVersion: "1.0" + type: "artifact" diff --git a/examples/gateways/artifact-nats-streaming.yaml b/examples/gateways/artifact-nats-streaming.yaml new file mode 100644 index 0000000000..b274cca678 --- /dev/null +++ b/examples/gateways/artifact-nats-streaming.yaml @@ -0,0 +1,35 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Gateway +metadata: + name: artifact-gateway-nats-streaming + labels: + gateways.argoproj.io/gateway-controller-instanceid: argo-events + gateway-name: "artifact-gateway-nats-streaming" +spec: + processorPort: "9330" + eventProtocol: + type: "NATS" + nats: + url: "nats://example-nats.argo-events:4222" + clusterId: "example-stan" + clientId: "myclient" + type: "Streaming" + deploySpec: + metadata: + name: "artifact-gateway-nats-streaming" + labels: + gateway-name: "artifact-gateway-nats-streaming" + spec: + containers: + - name: "gateway-client" + image: "argoproj/gateway-client" + imagePullPolicy: "Always" + command: ["/bin/gateway-client"] + - name: "artifact-events" + image: "argoproj/artifact-gateway" + imagePullPolicy: "Always" + command: ["/bin/artifact-gateway"] + serviceAccountName: "argo-events-sa" + configMap: "artifact-gateway-configmap" + eventVersion: "1.0" + type: "artifact" diff --git a/examples/gateways/artifact.yaml b/examples/gateways/artifact.yaml deleted file mode 100644 index f5acf5d0d5..0000000000 --- a/examples/gateways/artifact.yaml +++ /dev/null @@ -1,23 +0,0 @@ -apiVersion: argoproj.io/v1alpha1 -kind: Gateway -metadata: - name: artifact-gateway - labels: - gateways.argoproj.io/gateway-controller-instanceid: argo-events - gateway-name: "artifact-gateway" -spec: - deploySpec: - containers: - - name: "artifact-events" - image: "argoproj/artifact-gateway" - imagePullPolicy: "Always" - command: ["/bin/artifact-gateway"] - serviceAccountName: "argo-events-sa" - configMap: "artifact-gateway-configmap" - eventVersion: "1.0" - imageVersion: "latest" - type: "artifact" - dispatchMechanism: "HTTP" - watchers: - sensors: - - name: "artifact-sensor" diff --git a/examples/gateways/calendar-gateway-configmap.yaml b/examples/gateways/calendar-gateway-configmap.yaml index 0683c65718..80467e80d4 100644 --- a/examples/gateways/calendar-gateway-configmap.yaml +++ b/examples/gateways/calendar-gateway-configmap.yaml @@ -3,7 +3,7 @@ kind: ConfigMap metadata: name: calendar-gateway-configmap data: - foo: |- + interval: |- interval: 55s - bar: |- + schedule: |- schedule: 30 * * * * diff --git a/examples/gateways/calendar.yaml b/examples/gateways/calendar.yaml index 3674e5797f..86a550a28e 100644 --- a/examples/gateways/calendar.yaml +++ b/examples/gateways/calendar.yaml @@ -6,18 +6,30 @@ metadata: gateways.argoproj.io/gateway-controller-instanceid: argo-events gateway-name: "calendar-gateway" spec: + processorPort: "9330" + dispatchProtocol: + type: "HTTP" + http: + port: "9300" deploySpec: - containers: - - name: "calendar-events" - image: "argoproj/calendar-gateway" - imagePullPolicy: "Always" - command: ["/bin/calendar-gateway"] - serviceAccountName: "argo-events-sa" + metadata: + name: "calendar-gateway" + labels: + gateway-name: "calendar-gateway" + spec: + containers: + - name: "gateway-client" + image: "argoproj/gateway-client" + imagePullPolicy: "Always" + command: ["/bin/gateway-client"] + - name: "calendar-events" + image: "argoproj/calendar-gateway" + imagePullPolicy: "Always" + command: ["/bin/calendar-gateway"] + serviceAccountName: "argo-events-sa" configMap: "calendar-gateway-configmap" type: "calendar" - dispatchMechanism: "HTTP" eventVersion: "1.0" - imageVersion: "latest" watchers: sensors: - name: "calendar-sensor" diff --git a/examples/gateways/file.yaml b/examples/gateways/file.yaml index c7b04d16fe..abbfbde7c2 100644 --- a/examples/gateways/file.yaml +++ b/examples/gateways/file.yaml @@ -6,18 +6,30 @@ metadata: gateways.argoproj.io/gateway-controller-instanceid: argo-events gateway-name: "file-gateway" spec: + processorPort: "9330" + dispatchProtocol: + type: "HTTP" + http: + port: "9300" deploySpec: - containers: - - name: "file-events" - image: "argoproj/file-gateway" - imagePullPolicy: "Always" - command: ["/bin/file-gateway"] - serviceAccountName: "argo-events-sa" + metadata: + name: "file-gateway" + labels: + gateway-name: "file-gateway" + spec: + containers: + - name: "gateway-client" + image: "argoproj/gateway-client" + imagePullPolicy: "Always" + command: ["/bin/gateway-client"] + - name: "file-events" + image: "argoproj/file-gateway" + imagePullPolicy: "Always" + command: ["/bin/file-gateway"] + serviceAccountName: "argo-events-sa" configMap: "file-gateway-configmap" eventVersion: "1.0" - imageVersion: "latest" type: "file" - dispatchMechanism: "HTTP" watchers: sensors: - name: "file-sensor" diff --git a/examples/gateways/github-configmap.yaml b/examples/gateways/github-configmap.yaml index 6004bcf30f..f9edcb656c 100644 --- a/examples/gateways/github-configmap.yaml +++ b/examples/gateways/github-configmap.yaml @@ -6,7 +6,7 @@ data: project_1: |- owner: "owner-example" repository: "repo-example" - url: "http://webhook-gateway-gateway-svc/push" + url: "http://webhook-gateway-http-svc/push" events: - "*" apiToken: diff --git a/examples/gateways/github.yaml b/examples/gateways/github.yaml index 4c4069130b..a24396d881 100644 --- a/examples/gateways/github.yaml +++ b/examples/gateways/github.yaml @@ -6,27 +6,30 @@ metadata: gateways.argoproj.io/gateway-controller-instanceid: argo-events gateway-name: "github-gateway" spec: + processorPort: "9330" + dispatchProtocol: + type: "HTTP" + http: + port: "9300" deploySpec: metadata: + name: "github-gateway" labels: - gateway-type: github - dispatch-mechanism: http + gateway-name: "github-gateway" spec: containers: - name: "gateway-client" - image: "metalgearsolid/gateway-client:v0.6.1" + image: "argoproj/gateway-client" imagePullPolicy: "Always" command: ["/bin/gateway-client"] - - name: "file-events" - image: "metalgearsolid/github-gateway:v0.6.1" + - name: "github-events" + image: "argoproj/github-gateway" imagePullPolicy: "Always" command: ["/bin/github-gateway"] serviceAccountName: "argo-events-sa" configMap: "github-gateway-configmap" type: "github" - dispatchProtocol: "HTTP" eventVersion: "1.0" - processorPort: "9330" watchers: sensors: - name: "github-sensor" diff --git a/examples/gateways/gitlab.yaml b/examples/gateways/gitlab.yaml index 47bf974dcd..5be3fa426c 100644 --- a/examples/gateways/gitlab.yaml +++ b/examples/gateways/gitlab.yaml @@ -6,18 +6,30 @@ metadata: gateways.argoproj.io/gateway-controller-instanceid: argo-events gateway-name: "gitlab-gateway" spec: + processorPort: "9330" + eventProtocol: + type: "HTTP" + http: + port: "9300" deploySpec: - containers: - - name: "gitlab-events" - image: "argoproj/gitlab-gateway" - imagePullPolicy: "Always" - command: ["/bin/gitlab-gateway"] - serviceAccountName: "argo-events-sa" + metadata: + name: "gitlab-gateway" + labels: + gateway-name: "gitlab-gateway" + spec: + containers: + - name: "gateway-client" + image: "argoproj/gateway-client" + imagePullPolicy: "Always" + command: ["/bin/gateway-client"] + - name: "gitlab-events" + image: "argoproj/gitlab-gateway" + imagePullPolicy: "Always" + command: ["/bin/gitlab-gateway"] + serviceAccountName: "argo-events-sa" configMap: "gitlab-gateway-configmap" type: "gitlab" - dispatchMechanism: "HTTP" eventVersion: "1.0" - imageVersion: "latest" watchers: sensors: - name: "gitlab-sensor" diff --git a/examples/gateways/kafka.yaml b/examples/gateways/kafka.yaml index f4287edfcd..449682817e 100644 --- a/examples/gateways/kafka.yaml +++ b/examples/gateways/kafka.yaml @@ -6,18 +6,30 @@ metadata: gateways.argoproj.io/gateway-controller-instanceid: argo-events gateway-name: "kafka-gateway" spec: + processorPort: "9330" + eventProtocol: + type: "HTTP" + http: + port: "9300" deploySpec: - containers: - - name: "kafka-events" - image: "argoproj/kafka-gateway" - imagePullPolicy: "Always" - command: ["/bin/kafka-gateway"] - serviceAccountName: "argo-events-sa" + metadata: + name: "kafka-gateway" + labels: + gateway-name: "kafka-gateway" + spec: + containers: + - name: "gateway-client" + image: "argoproj/gateway-client" + imagePullPolicy: "Always" + command: ["/bin/gateway-client"] + - name: "kafka-events" + image: "argoproj/kafka-gateway" + imagePullPolicy: "Always" + command: ["/bin/kafka-gateway"] + serviceAccountName: "argo-events-sa" configMap: "kafka-gateway-configmap" type: "kafka" - dispatchMechanism: "HTTP" eventVersion: "1.0" - imageVersion: "latest" watchers: sensors: - name: "kafka-sensor" diff --git a/examples/gateways/mqtt.yaml b/examples/gateways/mqtt.yaml index 6f0fbb1b56..8d15408e15 100644 --- a/examples/gateways/mqtt.yaml +++ b/examples/gateways/mqtt.yaml @@ -6,18 +6,30 @@ metadata: gateways.argoproj.io/gateway-controller-instanceid: argo-events gateway-name: "mqtt-gateway" spec: + processorPort: "9330" + eventProtocol: + type: "HTTP" + http: + port: "9300" deploySpec: - containers: - - name: "mqtt-events" - image: "argoproj/mqtt-gateway" - imagePullPolicy: "Always" - command: ["/bin/mqtt-gateway"] - serviceAccountName: "argo-events-sa" + metadata: + name: "mqtt-gateway" + labels: + gateway-name: "mqtt-gateway" + spec: + containers: + - name: "gateway-client" + image: "argoproj/gateway-client" + imagePullPolicy: "Always" + command: ["/bin/gateway-client"] + - name: "mqtt-events" + image: "argoproj/mqtt-gateway" + imagePullPolicy: "Always" + command: ["/bin/mqtt-gateway"] + serviceAccountName: "argo-events-sa" configMap: "mqtt-gateway-configmap" type: "mqtt" - dispatchMechanism: "HTTP" eventVersion: "1.0" - imageVersion: "latest" watchers: sensors: - - name: "mqtt-sensor" + - name: "mqtt-sensor" diff --git a/examples/gateways/multi-watchers.yaml b/examples/gateways/multi-watchers.yaml index fd82ee0da7..1132ac8758 100644 --- a/examples/gateways/multi-watchers.yaml +++ b/examples/gateways/multi-watchers.yaml @@ -6,25 +6,40 @@ metadata: gateways.argoproj.io/gateway-controller-instanceid: argo-events gateway-name: "webhook-gateway-multi-watchers" spec: + processorPort: "9330" + eventProtocol: + type: "HTTP" + http: + port: "9300" + deploySpec: + metadata: + name: "webhook-gateway" + labels: + gateway-name: "webhook-gateway" + spec: + containers: + - name: "gateway-client" + image: "argoproj/gateway-client" + imagePullPolicy: "Always" + command: ["/bin/gateway-client"] + - name: "webhook-events" + image: "argoproj/webhook-gateway" + imagePullPolicy: "Always" + command: ["/bin/webhook-gateway"] + serviceAccountName: "argo-events-sa" configMap: "webhook-gateway-configmap" type: "webhook" - dispatchMechanism: "HTTP" eventVersion: "1.0" - imageVersion: "latest" - deploySpec: - containers: - - name: "webhook-events" - image: "argoproj/webhook-gateway" - imagePullPolicy: "Always" - command: ["/bin/webhook-gateway"] - serviceAccountName: "argo-events-sa" serviceSpec: - selector: - gateway-name: "webhook-gateway-multi-watchers" - ports: - - port: 12000 - targetPort: 12000 - type: LoadBalancer + metadata: + name: webhook-gateway-svc + spec: + selector: + gateway-name: "webhook-gateway-http" + ports: + - port: 12000 + targetPort: 12000 + type: LoadBalancer watchers: # requirement for adding gateway as watcher is there should be a http server running in watcher gateway # and user must provide port and endpoint on which event should be dispatched. diff --git a/examples/gateways/nats.yaml b/examples/gateways/nats.yaml index 0be0af563a..67876d02a3 100644 --- a/examples/gateways/nats.yaml +++ b/examples/gateways/nats.yaml @@ -6,18 +6,30 @@ metadata: gateways.argoproj.io/gateway-controller-instanceid: argo-events gateway-name: "nats-gateway" spec: + processorPort: "9330" + eventProtocol: + type: "HTTP" + http: + port: "9300" deploySpec: - containers: - - name: "nats-events" - image: "argoproj/nats-gateway" - imagePullPolicy: "Always" - command: ["/bin/nats-gateway"] - serviceAccountName: "argo-events-sa" + metadata: + name: "nats-gateway" + labels: + gateway-name: "nats-gateway" + spec: + containers: + - name: "gateway-client" + image: "argoproj/gateway-client" + imagePullPolicy: "Always" + command: ["/bin/gateway-client"] + - name: "nats-events" + image: "argoproj/nats-gateway" + imagePullPolicy: "Always" + command: ["/bin/nats-gateway"] + serviceAccountName: "argo-events-sa" configMap: "nats-gateway-configmap" type: "nats" - dispatchMechanism: "HTTP" eventVersion: "1.0" - imageVersion: "latest" watchers: sensors: - name: "nats-sensor" diff --git a/examples/gateways/resource.yaml b/examples/gateways/resource.yaml index eaae5e114e..1e208527a6 100644 --- a/examples/gateways/resource.yaml +++ b/examples/gateways/resource.yaml @@ -1,4 +1,3 @@ - apiVersion: argoproj.io/v1alpha1 kind: Gateway metadata: @@ -7,18 +6,30 @@ metadata: gateways.argoproj.io/gateway-controller-instanceid: argo-events gateway-name: "resource-gateway" spec: + processorPort: "9330" + eventProtocol: + type: "HTTP" + http: + port: "9300" deploySpec: - containers: - - name: "resource-events" - image: "argoproj/resource-gateway" - imagePullPolicy: "Always" - command: ["/bin/resource-gateway"] - serviceAccountName: "argo-events-sa" + metadata: + name: "resource-gateway" + labels: + gateway-name: "resource-gateway" + spec: + containers: + - name: "gateway-client" + image: "argoproj/gateway-client" + imagePullPolicy: "Always" + command: ["/bin/gateway-client"] + - name: "resource-events" + image: "argoproj/resource-gateway" + imagePullPolicy: "Always" + command: ["/bin/resource-gateway"] + serviceAccountName: "argo-events-sa" configMap: "resource-gateway-configmap" type: "resource" - dispatchMechanism: "HTTP" eventVersion: "1.0" - imageVersion: "latest" watchers: sensors: - name: "resource-sensor" diff --git a/examples/gateways/storage-grid-configmap.yaml b/examples/gateways/storage-grid-configmap.yaml index e6807c3191..99e1e0b751 100644 --- a/examples/gateways/storage-grid-configmap.yaml +++ b/examples/gateways/storage-grid-configmap.yaml @@ -8,6 +8,3 @@ data: endpoint: "/" events: - "ObjectCreated:Put" - filter: - suffix: ".txt" - prefix: "hello-" diff --git a/examples/gateways/storage-grid.yaml b/examples/gateways/storage-grid.yaml index 74c4fb29d8..32a64283ef 100644 --- a/examples/gateways/storage-grid.yaml +++ b/examples/gateways/storage-grid.yaml @@ -8,22 +8,37 @@ metadata: spec: configMap: "storage-grid-gateway-configmap" type: "storage_grid" - dispatchMechanism: "HTTP" + processorPort: "9330" + dispatchProtocol: + type: "HTTP" + http: + port: "9300" eventVersion: "1.0" - imageVersion: "latest" deploySpec: - containers: - - name: "storage-grid-events" - image: "argoproj/storage-grid-gateway" - imagePullPolicy: "Always" - serviceAccountName: "argo-events-sa" + metadata: + name: "storage-grid-gateway" + labels: + gateway-name: "storage-grid-gateway" + spec: + containers: + - name: "gateway-client" + image: "argoproj/gateway-client" + imagePullPolicy: "Always" + command: ["/bin/gateway-client"] + - name: "storage-grid-events" + image: "argoproj/storage-grid-gateway" + imagePullPolicy: "Always" + serviceAccountName: "argo-events-sa" serviceSpec: - selector: - gateway-name: "storage-grid-gateway" - ports: - - port: 8080 - targetPort: 8080 - type: LoadBalancer + metadata: + name: storage-grid-gateway-svc + spec: + selector: + gateway-name: "storage-grid-gateway" + ports: + - port: 8080 + targetPort: 8080 + type: LoadBalancer watchers: sensors: - name: "storage-grid-watcher-sensor" diff --git a/examples/gateways/webhook-gateway-configmap.yaml b/examples/gateways/webhook-gateway-configmap.yaml index d4a266d74b..e074b3011e 100644 --- a/examples/gateways/webhook-gateway-configmap.yaml +++ b/examples/gateways/webhook-gateway-configmap.yaml @@ -5,8 +5,9 @@ metadata: data: index: |- port: "12000" - endpoint: "/" + endpoint: "/index" method: "POST" foo: |- + port: "12000" endpoint: "/foo" method: "POST" diff --git a/examples/gateways/webhook-http.yaml b/examples/gateways/webhook-http.yaml new file mode 100644 index 0000000000..bf431d5879 --- /dev/null +++ b/examples/gateways/webhook-http.yaml @@ -0,0 +1,45 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Gateway +metadata: + name: webhook-gateway-http + labels: + gateways.argoproj.io/gateway-controller-instanceid: argo-events + gateway-name: "webhook-gateway-http" +spec: + configMap: "webhook-gateway-configmap" + type: "webhook" + processorPort: "9330" + eventProtocol: + type: "HTTP" + http: + port: "9300" + eventVersion: "1.0" + deploySpec: + metadata: + name: "webhook-gateway-http" + labels: + gateway-name: "webhook-gateway-http" + spec: + containers: + - name: "gateway-client" + image: "argoproj/gateway-client" + imagePullPolicy: "Always" + command: ["/bin/gateway-client"] + - name: "webhook-events" + image: "argoproj/webhook-gateway" + imagePullPolicy: "Always" + command: ["/bin/webhook-gateway"] + serviceAccountName: "argo-events-sa" + serviceSpec: + metadata: + name: webhook-gateway-svc + spec: + selector: + gateway-name: "webhook-gateway-http" + ports: + - port: 12000 + targetPort: 12000 + type: LoadBalancer + watchers: + sensors: + - name: "webhook-sensor-http" diff --git a/examples/gateways/webhook-nats-standard.yaml b/examples/gateways/webhook-nats-standard.yaml new file mode 100644 index 0000000000..04a2aed176 --- /dev/null +++ b/examples/gateways/webhook-nats-standard.yaml @@ -0,0 +1,43 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Gateway +metadata: + name: webhook-gateway-nats + labels: + gateways.argoproj.io/gateway-controller-instanceid: argo-events + gateway-name: "webhook-gateway-nats" +spec: + configMap: "webhook-gateway-configmap" + type: "webhook" + processorPort: "9330" + eventProtocol: + type: "NATS" + nats: + url: "nats://nats.argo-events:4222" + type: "Standard" + eventVersion: "1.0" + deploySpec: + metadata: + name: "webhook-gateway-nats" + labels: + gateway-name: "webhook-gateway-nats" + spec: + containers: + - name: "gateway-client" + image: "argoproj/gateway-client" + imagePullPolicy: "Always" + command: ["/bin/gateway-client"] + - name: "webhook-events" + image: "argoproj/webhook-gateway" + imagePullPolicy: "Always" + command: ["/bin/webhook-gateway"] + serviceAccountName: "argo-events-sa" + serviceSpec: + metadata: + name: webhook-gateway-svc + spec: + selector: + gateway-name: "webhook-gateway-nats" + ports: + - port: 12000 + targetPort: 12000 + type: LoadBalancer diff --git a/examples/gateways/webhook-nats-streaming.yaml b/examples/gateways/webhook-nats-streaming.yaml new file mode 100644 index 0000000000..f8b18dd4ba --- /dev/null +++ b/examples/gateways/webhook-nats-streaming.yaml @@ -0,0 +1,45 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Gateway +metadata: + name: webhook-gateway-nats-streaming + labels: + gateways.argoproj.io/gateway-controller-instanceid: argo-events + gateway-name: "webhook-gateway-nats-streaming" +spec: + configMap: "webhook-gateway-configmap" + type: "webhook" + processorPort: "9330" + dispatchProtocol: + type: "NATS" + nats: + url: "nats://example-nats.argo-events:4222" + clusterId: "example-stan" + clientId: "myclient" + type: "Streaming" + eventVersion: "1.0" + deploySpec: + metadata: + name: "webhook-gateway-nats-streaming" + labels: + gateway-name: "webhook-gateway-nats-streaming" + spec: + containers: + - name: "gateway-client" + image: "argoproj/gateway-client" + imagePullPolicy: "Always" + command: ["/bin/gateway-client"] + - name: "webhook-events" + image: "argoproj/webhook-gateway" + imagePullPolicy: "Always" + command: ["/bin/webhook-gateway"] + serviceAccountName: "argo-events-sa" + serviceSpec: + metadata: + name: webhook-gateway-svc + spec: + selector: + gateway-name: "webhook-gateway-nats-streaming" + ports: + - port: 12000 + targetPort: 12000 + type: LoadBalancer diff --git a/examples/gateways/webhook.yaml b/examples/gateways/webhook.yaml deleted file mode 100644 index 921887aced..0000000000 --- a/examples/gateways/webhook.yaml +++ /dev/null @@ -1,31 +0,0 @@ -apiVersion: argoproj.io/v1alpha1 -kind: Gateway -metadata: - name: webhook-gateway - labels: - gateways.argoproj.io/gateway-controller-instanceid: argo-events - gateway-name: "webhook-gateway" -spec: - configMap: "webhook-gateway-configmap" - type: "webhook" - dispatchMechanism: "HTTP" - eventVersion: "1.0" - imageVersion: "latest" - deploySpec: - containers: - - name: "webhook-events" - image: "argoproj/webhook-gateway" - imagePullPolicy: "IfNotPresent" - command: ["/bin/webhook-gateway"] - serviceAccountName: "argo-events-sa" - transformerImage: "argoproj/gateway-http-transformer" - serviceSpec: - selector: - gateway-name: "webhook-gateway" - ports: - - port: 12000 - targetPort: 12000 - type: LoadBalancer - watchers: - sensors: - - name: "webhook-sensor" diff --git a/examples/sensors/amqp.yaml b/examples/sensors/amqp.yaml index 8867c18265..92879885d9 100644 --- a/examples/sensors/amqp.yaml +++ b/examples/sensors/amqp.yaml @@ -5,12 +5,18 @@ metadata: labels: sensors.argoproj.io/sensor-controller-instanceid: argo-events spec: - repeat: true - serviceAccountName: argo-events-sa - imageVersion: "latest" - imagePullPolicy: Always - signals: - - name: amqp-gateway/foo + deploySpec: + containers: + - name: "sensor" + image: "argoproj/sensor" + imagePullPolicy: Always + serviceAccountName: argo-events-sa + eventProtocol: + type: "HTTP" + http: + port: "9300" + dependencies: + - name: "amqp-gateway:foo" triggers: - name: amqp-workflow-trigger resource: diff --git a/examples/sensors/artifact-with-param-nats-standard.yaml b/examples/sensors/artifact-with-param-nats-standard.yaml new file mode 100644 index 0000000000..e130484c26 --- /dev/null +++ b/examples/sensors/artifact-with-param-nats-standard.yaml @@ -0,0 +1,47 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Sensor +metadata: + name: artifact-with-param-nats-standard-sensor + labels: + sensors.argoproj.io/sensor-controller-instanceid: argo-events +spec: + deploySpec: + containers: + - name: "sensor" + image: "argoproj/sensor" + imagePullPolicy: Always + serviceAccountName: argo-events-sa + eventProtocol: + type: "NATS" + nats: + type: "Standard" + url: "nats://example-nats.argo-events:4222" + dependencies: + - name: "artifact-gateway-nats-standard:input" + triggers: + - name: argo-workflow + resource: + namespace: argo-events + group: argoproj.io + version: v1alpha1 + kind: Workflow + # The container args from the workflow are overridden by the s3 notification key + parameters: + - src: + event: "artifact-gateway-nats-standard:input" + path: s3.object.key + dest: spec.templates.0.container.args.0 + source: + inline: | + apiVersion: argoproj.io/v1alpha1 + kind: Workflow + metadata: + generateName: artifact-workflow- + spec: + entrypoint: whalesay + templates: + - name: whalesay + container: + command: + - cowsay + image: "docker/whalesay:latest" diff --git a/examples/sensors/artifact-with-param-nats-streaming.yaml b/examples/sensors/artifact-with-param-nats-streaming.yaml new file mode 100644 index 0000000000..90621a7bbd --- /dev/null +++ b/examples/sensors/artifact-with-param-nats-streaming.yaml @@ -0,0 +1,49 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Sensor +metadata: + name: artifact-with-param-nats-streaming-sensor + labels: + sensors.argoproj.io/sensor-controller-instanceid: argo-events +spec: + deploySpec: + containers: + - name: "sensor" + image: "argoproj/sensor" + imagePullPolicy: Always + serviceAccountName: argo-events-sa + eventProtocol: + type: "NATS" + nats: + type: "Streaming" + url: "nats://example-nats.argo-events:4222" + clusterId: "example-stan" + clientId: "myclient1" + dependencies: + - name: "artifact-gateway-nats-streaming:input" + triggers: + - name: argo-workflow + resource: + namespace: argo-events + group: argoproj.io + version: v1alpha1 + kind: Workflow + # The container args from the workflow are overridden by the s3 notification key + parameters: + - src: + event: "artifact-gateway-nats-streaming:input" + path: s3.object.key + dest: spec.templates.0.container.args.0 + source: + inline: | + apiVersion: argoproj.io/v1alpha1 + kind: Workflow + metadata: + generateName: artifact-workflow- + spec: + entrypoint: whalesay + templates: + - name: whalesay + container: + command: + - cowsay + image: "docker/whalesay:latest" diff --git a/examples/sensors/s3-with-param.yaml b/examples/sensors/artifact-with-param.yaml similarity index 75% rename from examples/sensors/s3-with-param.yaml rename to examples/sensors/artifact-with-param.yaml index fd853c1a70..526ba55f43 100644 --- a/examples/sensors/s3-with-param.yaml +++ b/examples/sensors/artifact-with-param.yaml @@ -5,12 +5,18 @@ metadata: labels: sensors.argoproj.io/sensor-controller-instanceid: argo-events spec: - repeat: true - serviceAccountName: argo-events-sa - imageVersion: "latest" - imagePullPolicy: Always - signals: - - name: artifact-gateway/input + deploySpec: + containers: + - name: "sensor" + image: "argoproj/sensor" + imagePullPolicy: Always + serviceAccountName: argo-events-sa + eventProtocol: + type: "HTTP" + http: + port: "9300" + dependencies: + - name: "artifact-gateway:input" triggers: - name: argo-workflow resource: @@ -21,7 +27,7 @@ spec: # The container args from the workflow are overridden by the s3 notification key parameters: - src: - signal: artifact-gateway/input + event: "artifact-gateway:input" path: s3.object.key dest: spec.templates.0.container.args.0 source: diff --git a/examples/sensors/s3.yaml b/examples/sensors/artifact.yaml similarity index 75% rename from examples/sensors/s3.yaml rename to examples/sensors/artifact.yaml index e5ebb256b7..19a63c20f4 100644 --- a/examples/sensors/s3.yaml +++ b/examples/sensors/artifact.yaml @@ -5,12 +5,18 @@ metadata: labels: sensors.argoproj.io/sensor-controller-instanceid: argo-events spec: - repeat: true - serviceAccountName: argo-events-sa - imageVersion: "latest" - imagePullPolicy: Always - signals: - - name: artifact-gateway/input + deploySpec: + containers: + - name: "sensor" + image: "argoproj/sensor" + imagePullPolicy: Always + serviceAccountName: argo-events-sa + eventProtocol: + type: "HTTP" + http: + port: "9300" + dependencies: + - name: "artifact-gateway:input" triggers: - name: artifact-workflow-trigger resource: diff --git a/examples/sensors/calendar.yaml b/examples/sensors/calendar.yaml index 1453651264..025a918b31 100644 --- a/examples/sensors/calendar.yaml +++ b/examples/sensors/calendar.yaml @@ -5,12 +5,18 @@ metadata: labels: sensors.argoproj.io/sensor-controller-instanceid: argo-events spec: - repeat: true - serviceAccountName: argo-events-sa - imageVersion: "latest" - imagePullPolicy: Always - signals: - - name: calendar-gateway/foo + deploySpec: + containers: + - name: "sensor" + image: "argoproj/sensor" + imagePullPolicy: Always + serviceAccountName: argo-events-sa + dependencies: + - name: "calendar-gateway:interval" + eventProtocol: + type: "HTTP" + http: + port: "9300" triggers: - name: calendar-workflow-trigger resource: diff --git a/examples/sensors/context-filter-webhook.yaml b/examples/sensors/context-filter-webhook.yaml index 72d6c0d013..60d107298f 100644 --- a/examples/sensors/context-filter-webhook.yaml +++ b/examples/sensors/context-filter-webhook.yaml @@ -5,17 +5,23 @@ metadata: labels: sensors.argoproj.io/sensor-controller-instanceid: argo-events spec: - repeat: true - serviceAccountName: argo-events-sa - imageVersion: "latest" - imagePullPolicy: Always - signals: - - name: webhook-gateway/index + deploySpec: + containers: + - name: "sensor" + image: "argoproj/sensor" + imagePullPolicy: Always + serviceAccountName: argo-events-sa + dependencies: + - name: "webhook-gateway:foo" filters: context: - source: - host: xyz.com - contentType: application/json + source: + host: xyz.com + contentType: application/json + eventProtocol: + type: "HTTP" + http: + port: "9300" triggers: - name: done-workflow resource: diff --git a/examples/sensors/data-filter-webhook.yaml b/examples/sensors/data-filter-webhook.yaml index cf1024d538..613e0b1abf 100644 --- a/examples/sensors/data-filter-webhook.yaml +++ b/examples/sensors/data-filter-webhook.yaml @@ -6,17 +6,23 @@ metadata: labels: sensors.argoproj.io/sensor-controller-instanceid: argo-events spec: - repeat: true - serviceAccountName: argo-events-sa - imageVersion: "latest" - imagePullPolicy: Always - signals: - - name: webhook-gateway/foo + deploySpec: + containers: + - name: "sensor" + image: "argoproj/sensor" + imagePullPolicy: Always + serviceAccountName: argo-events-sa + dependencies: + - name: "webhook-gateway:foo" filters: data: - - path: bucket - type: string - value: argo-workflow-input + - path: bucket + type: string + value: argo-workflow-input + eventProtocol: + type: "HTTP" + http: + port: "9300" triggers: - name: done-workflow resource: diff --git a/examples/sensors/file-sensor.yaml b/examples/sensors/file-sensor.yaml index 3743d1b907..a98ca8eab0 100644 --- a/examples/sensors/file-sensor.yaml +++ b/examples/sensors/file-sensor.yaml @@ -5,12 +5,18 @@ metadata: labels: sensors.argoproj.io/sensor-controller-instanceid: argo-events spec: - repeat: true - serviceAccountName: argo-events-sa - imageVersion: "latest" - imagePullPolicy: Always - signals: - - name: calendar-gateway/foo + deploySpec: + containers: + - name: "sensor" + image: "argoproj/sensor" + imagePullPolicy: Always + serviceAccountName: argo-events-sa + dependencies: + - name: "calendar-gateway:foo" + eventProtocol: + type: "HTTP" + http: + port: "9300" triggers: - name: file-workflow-trigger resource: diff --git a/examples/sensors/file.yaml b/examples/sensors/file.yaml index 4ef5452dee..8ec8fe6c4c 100644 --- a/examples/sensors/file.yaml +++ b/examples/sensors/file.yaml @@ -5,12 +5,18 @@ metadata: labels: sensors.argoproj.io/sensor-controller-instanceid: argo-events spec: - repeat: true - serviceAccountName: argo-events-sa - imageVersion: "latest" - imagePullPolicy: Always - signals: - - name: file-gateway/bindir + deploySpec: + containers: + - name: "sensor" + image: "argoproj/sensor:v0.6.3" + imagePullPolicy: Always + serviceAccountName: argo-events-sa + dependencies: + - name: "file-gateway:bindir" + eventProtocol: + type: "HTTP" + http: + port: "9300" triggers: - name: file-workflow-trigger resource: diff --git a/examples/sensors/github.yaml b/examples/sensors/github.yaml index 53c47b39e2..5cdbe42153 100644 --- a/examples/sensors/github.yaml +++ b/examples/sensors/github.yaml @@ -5,12 +5,18 @@ metadata: labels: sensors.argoproj.io/sensor-controller-instanceid: argo-events spec: - repeat: true - serviceAccountName: argo-events-sa - imageVersion: "latest" - imagePullPolicy: Always - signals: - - name: webhook-gateway/index + deploySpec: + containers: + - name: "sensor" + image: "argoproj/sensor" + imagePullPolicy: Always + serviceAccountName: argo-events-sa + dependencies: + - name: "webhook-gateway-http:push" + eventProtocol: + type: "HTTP" + http: + port: "9300" triggers: - name: github-workflow-trigger resource: @@ -18,19 +24,31 @@ spec: group: argoproj.io version: v1alpha1 kind: Workflow + # The parameters from the workflow are overridden by the webhook's message + # An empty path means complete payload will be passed to trigger + parameters: + - src: + event: "webhook-gateway-http:push" + dest: spec.arguments.parameters.0.value source: inline: | apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: - generateName: hello-world- + generateName: arguments-via-webhook-event spec: entrypoint: whalesay + arguments: + parameters: + - name: message + # this is the value that should be overridden + value: hello world templates: - - name: whalesay - container: - args: - - "hello world" - command: - - cowsay - image: "docker/whalesay:latest" + - name: whalesay + inputs: + parameters: + - name: message + container: + image: docker/whalesay:latest + command: [cowsay] + args: ["{{inputs.parameters.message}}"] diff --git a/examples/sensors/gitlab.yaml b/examples/sensors/gitlab.yaml index e873a0b1c5..60ce300527 100644 --- a/examples/sensors/gitlab.yaml +++ b/examples/sensors/gitlab.yaml @@ -5,12 +5,18 @@ metadata: labels: sensors.argoproj.io/sensor-controller-instanceid: argo-events spec: - repeat: true - serviceAccountName: argo-events-sa - imageVersion: "latest" - imagePullPolicy: Always - signals: - - name: webhook-gateway/index + deploySpec: + containers: + - name: "sensor" + image: "argoproj/sensor" + imagePullPolicy: Always + serviceAccountName: argo-events-sa + eventProtocol: + type: "HTTP" + http: + port: "9300" + dependencies: + - name: "webhook-gateway-http:foo" triggers: - name: gitlab-workflow-trigger resource: diff --git a/examples/sensors/inline-sensor.yaml b/examples/sensors/inline-sensor.yaml index 6ac37cba03..0eb0b86f9b 100644 --- a/examples/sensors/inline-sensor.yaml +++ b/examples/sensors/inline-sensor.yaml @@ -5,12 +5,18 @@ metadata: labels: sensors.argoproj.io/sensor-controller-instanceid: argo-events spec: - repeat: true - serviceAccountName: argo-events-sa - imageVersion: "latest" - imagePullPolicy: Always - signals: - - name: calendar-gateway/foo + deploySpec: + containers: + - name: "sensor" + image: "argoproj/sensor" + imagePullPolicy: Always + serviceAccountName: argo-events-sa + eventProtocol: + type: "HTTP" + http: + port: "9300" + dependencies: + - name: "calendar-gateway:interval" triggers: - name: inline-workflow-trigger resource: diff --git a/examples/sensors/kafka.yaml b/examples/sensors/kafka.yaml index 444d5f804c..a60bb81f80 100644 --- a/examples/sensors/kafka.yaml +++ b/examples/sensors/kafka.yaml @@ -5,12 +5,18 @@ metadata: labels: sensors.argoproj.io/sensor-controller-instanceid: argo-events spec: - repeat: true - serviceAccountName: argo-events-sa - imageVersion: "latest" - imagePullPolicy: Always - signals: - - name: kafka-gateway/foo + deploySpec: + containers: + - name: "sensor" + image: "argoproj/sensor" + imagePullPolicy: Always + serviceAccountName: argo-events-sa + eventProtocol: + type: "HTTP" + http: + port: "9300" + dependencies: + - name: "kafka-gateway/foo" triggers: - name: kafka-workflow-trigger resource: diff --git a/examples/sensors/mqtt-sensor.yaml b/examples/sensors/mqtt-sensor.yaml index 4930b2e225..e2dc5779b8 100644 --- a/examples/sensors/mqtt-sensor.yaml +++ b/examples/sensors/mqtt-sensor.yaml @@ -5,12 +5,18 @@ metadata: labels: sensors.argoproj.io/sensor-controller-instanceid: argo-events spec: - repeat: true - serviceAccountName: argo-events-sa - imageVersion: "latest" - imagePullPolicy: Always - signals: - - name: mqtt-gateway/foo + deploySpec: + containers: + - name: "sensor" + image: "argoproj/sensor" + imagePullPolicy: Always + serviceAccountName: argo-events-sa + eventProtocol: + type: "HTTP" + http: + port: "9300" + dependencies: + - name: "mqtt-gateway:foo" triggers: - name: mqtt-workflow-trigger resource: diff --git a/examples/sensors/multi-signal-sensor.yaml b/examples/sensors/multi-signal-sensor.yaml index b647fcbca0..5e2926efd8 100644 --- a/examples/sensors/multi-signal-sensor.yaml +++ b/examples/sensors/multi-signal-sensor.yaml @@ -5,13 +5,19 @@ metadata: labels: sensors.argoproj.io/sensor-controller-instanceid: argo-events spec: - repeat: true - serviceAccountName: argo-events-sa - imageVersion: "latest" - imagePullPolicy: Always - signals: - - name: webhook-gateway/foo - - name: calendar-gateway/foo + deploySpec: + containers: + - name: "sensor" + image: "argoproj/sensor" + imagePullPolicy: Always + serviceAccountName: argo-events-sa + eventProtocol: + type: "HTTP" + http: + port: "9300" + dependencies: + - name: "webhook-gateway-http:foo" + - name: "calendar-gateway:interval" triggers: - name: multi-signal-workflow-trigger resource: diff --git a/examples/sensors/multi-trigger-sensor.yaml b/examples/sensors/multi-trigger-sensor.yaml index fbaa056c9d..bb91ad0679 100644 --- a/examples/sensors/multi-trigger-sensor.yaml +++ b/examples/sensors/multi-trigger-sensor.yaml @@ -5,12 +5,18 @@ metadata: labels: sensors.argoproj.io/sensor-controller-instanceid: argo-events spec: - repeat: true - serviceAccountName: argo-events-sa - imageVersion: "latest" - imagePullPolicy: Always - signals: - - name: nats-gateway/foo + deploySpec: + containers: + - name: "sensor" + image: "argoproj/sensor" + imagePullPolicy: Always + serviceAccountName: argo-events-sa + eventProtocol: + type: "HTTP" + http: + port: "9300" + dependencies: + - name: "webhook-gateway-http:foo" triggers: - name: multi-trigger-workflow-1 resource: @@ -20,8 +26,9 @@ spec: kind: Workflow source: s3: - bucket: workflows - key: hello-world.yaml + bucket: + name: workflows + key: hello-world.yaml endpoint: minio-service.argo-events:9000 insecure: true accessKey: diff --git a/examples/sensors/nats.yaml b/examples/sensors/nats.yaml index 09818ba570..752f7d2583 100644 --- a/examples/sensors/nats.yaml +++ b/examples/sensors/nats.yaml @@ -7,12 +7,18 @@ metadata: labels: sensors.argoproj.io/sensor-controller-instanceid: argo-events spec: - repeat: true - serviceAccountName: argo-events-sa - imageVersion: "latest" - imagePullPolicy: Always - signals: - - name: nats-gateway/foo + deploySpec: + containers: + - name: "sensor" + image: "argoproj/sensor" + imagePullPolicy: Always + serviceAccountName: argo-events-sa + eventProtocol: + type: "HTTP" + http: + port: "9300" + dependencies: + - name: "nats-gateway:foo" triggers: - name: nats-workflow-trigger resource: diff --git a/examples/sensors/resource.yaml b/examples/sensors/resource.yaml index 2e5c1c70cd..d19fdac33d 100644 --- a/examples/sensors/resource.yaml +++ b/examples/sensors/resource.yaml @@ -5,12 +5,18 @@ metadata: labels: sensors.argoproj.io/sensor-controller-instanceid: argo-events spec: - repeat: true - serviceAccountName: argo-events-sa - imageVersion: "latest" - imagePullPolicy: Always - signals: - - name: resource-gateway/foo + deploySpec: + containers: + - name: "sensor" + image: "argoproj/sensor" + imagePullPolicy: Always + serviceAccountName: argo-events-sa + eventProtocol: + type: "HTTP" + http: + port: "9300" + dependencies: + - name: "resource-gateway:foo" triggers: - name: argo-workflow resource: diff --git a/examples/sensors/storage-grid-sensor.yaml b/examples/sensors/storage-grid-sensor.yaml index c9fbcbc2ca..5471792870 100644 --- a/examples/sensors/storage-grid-sensor.yaml +++ b/examples/sensors/storage-grid-sensor.yaml @@ -1,16 +1,22 @@ apiVersion: argoproj.io/v1alpha1 kind: Sensor metadata: - name: storage_grid-watcher-sensor + name: storage-grid-watcher-sensor labels: sensors.argoproj.io/sensor-controller-instanceid: argo-events spec: - repeat: true - serviceAccountName: argo-events-sa - imageVersion: "latest" - imagePullPolicy: Always - signals: - - name: storage-grid-gateway/foo + deploySpec: + containers: + - name: "sensor" + image: "argoproj/sensor" + imagePullPolicy: Always + serviceAccountName: argo-events-sa + dependencies: + - name: "storage-grid-gateway:my_bucket" + eventProtocol: + type: "HTTP" + http: + port: "9300" triggers: - name: argo-workflow resource: @@ -20,7 +26,7 @@ spec: kind: Workflow parameters: - src: - signal: storage-grid-gateway/foo + event: "storage-grid-gateway:my_bucket" path: value: hello world dest: spec.arguments.parameters.0.value @@ -29,8 +35,9 @@ spec: apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: - name: arguments-via-webhook-event + generateName: storage-grid-wf- spec: + serviceAccountName: argo-events-sa entrypoint: whalesay arguments: parameters: diff --git a/examples/sensors/time-filter-webhook.yaml b/examples/sensors/time-filter-webhook.yaml index 433fd6469f..3b44450efe 100644 --- a/examples/sensors/time-filter-webhook.yaml +++ b/examples/sensors/time-filter-webhook.yaml @@ -5,12 +5,18 @@ metadata: labels: sensors.argoproj.io/sensor-controller-instanceid: argo-events spec: - repeat: true - serviceAccountName: argo-events-sa - imageVersion: "latest" - imagePullPolicy: Always - signals: - - name: webhook-gateway/foo + deploySpec: + containers: + - name: "sensor" + image: "argoproj/sensor" + imagePullPolicy: Always + serviceAccountName: argo-events-sa + eventProtocol: + type: "HTTP" + http: + port: "9300" + dependencies: + - name: "webhook-gateway-http:foo" filters: time: start: "22:14:05" diff --git a/examples/sensors/url-sensor.yaml b/examples/sensors/url-sensor.yaml index 77cbcdad78..669d2135bb 100644 --- a/examples/sensors/url-sensor.yaml +++ b/examples/sensors/url-sensor.yaml @@ -5,12 +5,18 @@ metadata: labels: sensors.argoproj.io/sensor-controller-instanceid: argo-events spec: - repeat: true - serviceAccountName: argo-events-sa - imageVersion: "latest" - imagePullPolicy: Always - signals: - - name: calendar-gateway/foo + deploySpec: + containers: + - name: "sensor" + image: "argoproj/sensor" + imagePullPolicy: Always + serviceAccountName: argo-events-sa + eventProtocol: + type: "HTTP" + http: + port: "9300" + dependencies: + - name: "artifact-gateway:input" triggers: - name: url-workflow-trigger resource: diff --git a/examples/sensors/webhook.yaml b/examples/sensors/webhook-http.yaml similarity index 72% rename from examples/sensors/webhook.yaml rename to examples/sensors/webhook-http.yaml index 4de14a3e83..869e553ca4 100644 --- a/examples/sensors/webhook.yaml +++ b/examples/sensors/webhook-http.yaml @@ -1,17 +1,22 @@ - apiVersion: argoproj.io/v1alpha1 kind: Sensor metadata: - name: webhook-sensor + name: webhook-sensor-http labels: sensors.argoproj.io/sensor-controller-instanceid: argo-events spec: - repeat: true - serviceAccountName: argo-events-sa - imageVersion: "latest" - imagePullPolicy: Always - signals: - - name: webhook-gateway/foo + deploySpec: + containers: + - name: "sensor" + image: "argoproj/sensor" + imagePullPolicy: Always + serviceAccountName: argo-events + dependencies: + - name: "webhook-gateway-http:foo" + eventProtocol: + type: "HTTP" + http: + port: "9300" triggers: - name: webhook-workflow-trigger resource: diff --git a/examples/sensors/webhook-nats-streaming.yaml b/examples/sensors/webhook-nats-streaming.yaml new file mode 100644 index 0000000000..464294085d --- /dev/null +++ b/examples/sensors/webhook-nats-streaming.yaml @@ -0,0 +1,58 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Sensor +metadata: + name: webhook-nats-streaming + labels: + sensors.argoproj.io/sensor-controller-instanceid: argo-events +spec: + deploySpec: + containers: + - name: "sensor" + image: "argoproj/sensor" + imagePullPolicy: Always + serviceAccountName: argo-events-sa + eventProtocol: + type: "NATS" + nats: + type: "Streaming" + url: "nats://example-nats.argo-events:4222" + clusterId: "example-stan" + clientId: "myclient1" + deliverAllAvailable: true + dependencies: + - name: "webhook-gateway-nats-streaming:foo" + triggers: + - name: argo-workflow + resource: + namespace: argo-events + group: argoproj.io + version: v1alpha1 + kind: Workflow + # The parameters from the workflow are overridden by the webhook's message + # An empty path means complete payload will be passed to trigger + parameters: + - src: + event: "webhook-gateway-nats-streaming:foo" + dest: spec.arguments.parameters.0.value + source: + inline: | + apiVersion: argoproj.io/v1alpha1 + kind: Workflow + metadata: + generateName: arguments-via-webhook-event + spec: + entrypoint: whalesay + arguments: + parameters: + - name: message + # this is the value that should be overridden + value: hello world + templates: + - name: whalesay + inputs: + parameters: + - name: message + container: + image: docker/whalesay:latest + command: [cowsay] + args: ["{{inputs.parameters.message}}"] diff --git a/examples/sensors/webhook-nats.yaml b/examples/sensors/webhook-nats.yaml new file mode 100644 index 0000000000..f68540708e --- /dev/null +++ b/examples/sensors/webhook-nats.yaml @@ -0,0 +1,43 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Sensor +metadata: + name: webhook-sensor + labels: + sensors.argoproj.io/sensor-controller-instanceid: argo-events +spec: + deploySpec: + containers: + - name: "sensor" + image: "argoproj/sensor:v0.6.3" + imagePullPolicy: Always + serviceAccountName: argo-events-sa + dependencies: + - name: "webhook-gateway-nats:foo" + eventProtocol: + type: "NATS" + nats: + url: "nats://nats.argo-events:4222" + type: "Standard" + triggers: + - name: webhook-workflow-trigger + resource: + namespace: argo-events + group: argoproj.io + version: v1alpha1 + kind: Workflow + source: + inline: | + apiVersion: argoproj.io/v1alpha1 + kind: Workflow + metadata: + generateName: hello-world- + spec: + entrypoint: whalesay + templates: + - name: whalesay + container: + args: + - "hello world" + command: + - cowsay + image: "docker/whalesay:latest" diff --git a/examples/sensors/webhook-with-complete-payload.yaml b/examples/sensors/webhook-with-complete-payload.yaml index fc6bf1bf88..36dc62691b 100644 --- a/examples/sensors/webhook-with-complete-payload.yaml +++ b/examples/sensors/webhook-with-complete-payload.yaml @@ -5,12 +5,19 @@ metadata: labels: sensors.argoproj.io/sensor-controller-instanceid: argo-events spec: - repeat: true - serviceAccountName: argo-events-sa - imageVersion: "latest" - imagePullPolicy: Always - signals: - - name: webhook-gateway/foo + deploySpec: + containers: + - name: "sensor" + image: "argoproj/sensor:v0.6.2" + imagePullPolicy: Always + serviceAccountName: argo-events-sa + eventProtocol: + type: "NATS" + nats: + type: "Standard" + url: "nats://nats.argo-events:4222" + dependencies: + - name: "webhook-gateway-nats:foo" triggers: - name: argo-workflow resource: @@ -22,14 +29,14 @@ spec: # An empty path means complete payload will be passed to trigger parameters: - src: - signal: webhook-gateway/foo + event: "webhook-gateway-nats:foo" dest: spec.arguments.parameters.0.value source: inline: | apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: - name: arguments-via-webhook-event + generateName: arguments-via-webhook-event spec: entrypoint: whalesay arguments: diff --git a/examples/sensors/webhook-with-resource-param.yaml b/examples/sensors/webhook-with-resource-param.yaml index 3594d337ad..bc8ad8b8aa 100644 --- a/examples/sensors/webhook-with-resource-param.yaml +++ b/examples/sensors/webhook-with-resource-param.yaml @@ -5,12 +5,19 @@ metadata: labels: sensors.argoproj.io/sensor-controller-instanceid: argo-events spec: - repeat: true - serviceAccountName: argo-events-sa - imageVersion: "latest" - imagePullPolicy: Always - signals: - - name: webhook-gateway/foo + deploySpec: + containers: + - name: "sensor" + image: "argoproj/sensor:v0.6.2" + imagePullPolicy: Always + serviceAccountName: argo-events-sa + eventProtocol: + type: "NATS" + nats: + type: "Standard" + url: "nats://nats.argo-events:4222" + dependencies: + - name: "webhook-gateway-nats:foo" triggers: - name: argo-workflow resource: @@ -19,31 +26,32 @@ spec: version: v1alpha1 kind: Workflow # The parameters from the workflow are overridden by the webhook's message + # An empty path means complete payload will be passed to trigger parameters: - src: - signal: webhook-gateway/foo - path: message - value: hello default + event: "webhook-gateway-nats:foo" + path: "index.msg" + value: "default value" dest: spec.arguments.parameters.0.value source: inline: | - apiVersion: argoproj.io/v1alpha1 - kind: Workflow - metadata: - name: arguments-via-webhook-event - spec: - entrypoint: whalesay - arguments: + apiVersion: argoproj.io/v1alpha1 + kind: Workflow + metadata: + generateName: arguments-via-webhook-event + spec: + entrypoint: whalesay + arguments: + parameters: + - name: message + # this is the value that should be overridden + value: hello world + templates: + - name: whalesay + inputs: parameters: - name: message - # this is the value that should be overridden - value: hello world - templates: - - name: whalesay - inputs: - parameters: - - name: message - container: - image: docker/whalesay:latest - command: [cowsay] - args: ["{{inputs.parameters.message}}"] + container: + image: docker/whalesay:latest + command: [cowsay] + args: ["{{inputs.parameters.message}}"] diff --git a/gateways/custom/github/Dockerfile b/gateways/community/github/Dockerfile similarity index 100% rename from gateways/custom/github/Dockerfile rename to gateways/community/github/Dockerfile diff --git a/gateways/custom/github/cmd/main.go b/gateways/community/github/cmd/main.go similarity index 95% rename from gateways/custom/github/cmd/main.go rename to gateways/community/github/cmd/main.go index e85b37d345..43d0d486f8 100644 --- a/gateways/custom/github/cmd/main.go +++ b/gateways/community/github/cmd/main.go @@ -19,7 +19,7 @@ package main import ( "github.com/argoproj/argo-events/common" "github.com/argoproj/argo-events/gateways" - "github.com/argoproj/argo-events/gateways/custom/github" + "github.com/argoproj/argo-events/gateways/community/github" "k8s.io/client-go/kubernetes" "os" ) diff --git a/gateways/custom/github/config.go b/gateways/community/github/config.go similarity index 100% rename from gateways/custom/github/config.go rename to gateways/community/github/config.go diff --git a/gateways/custom/github/start.go b/gateways/community/github/start.go similarity index 100% rename from gateways/custom/github/start.go rename to gateways/community/github/start.go diff --git a/gateways/custom/github/tokenauth.go b/gateways/community/github/tokenauth.go similarity index 100% rename from gateways/custom/github/tokenauth.go rename to gateways/community/github/tokenauth.go diff --git a/gateways/custom/github/validate.go b/gateways/community/github/validate.go similarity index 100% rename from gateways/custom/github/validate.go rename to gateways/community/github/validate.go diff --git a/gateways/custom/github/validate_test.go b/gateways/community/github/validate_test.go similarity index 100% rename from gateways/custom/github/validate_test.go rename to gateways/community/github/validate_test.go diff --git a/gateways/custom/gitlab/Dockerfile b/gateways/community/gitlab/Dockerfile similarity index 100% rename from gateways/custom/gitlab/Dockerfile rename to gateways/community/gitlab/Dockerfile diff --git a/gateways/custom/gitlab/cmd/main.go b/gateways/community/gitlab/cmd/main.go similarity index 95% rename from gateways/custom/gitlab/cmd/main.go rename to gateways/community/gitlab/cmd/main.go index 956bb7e2ea..5a3653e7e5 100644 --- a/gateways/custom/gitlab/cmd/main.go +++ b/gateways/community/gitlab/cmd/main.go @@ -21,7 +21,7 @@ import ( "github.com/argoproj/argo-events/common" "github.com/argoproj/argo-events/gateways" - "github.com/argoproj/argo-events/gateways/custom/gitlab" + "github.com/argoproj/argo-events/gateways/community/gitlab" "k8s.io/client-go/kubernetes" ) diff --git a/gateways/custom/gitlab/config.go b/gateways/community/gitlab/config.go similarity index 100% rename from gateways/custom/gitlab/config.go rename to gateways/community/gitlab/config.go diff --git a/gateways/custom/gitlab/start.go b/gateways/community/gitlab/start.go similarity index 100% rename from gateways/custom/gitlab/start.go rename to gateways/community/gitlab/start.go diff --git a/gateways/custom/gitlab/validate.go b/gateways/community/gitlab/validate.go similarity index 100% rename from gateways/custom/gitlab/validate.go rename to gateways/community/gitlab/validate.go diff --git a/gateways/custom/gitlab/validate_test.go b/gateways/community/gitlab/validate_test.go similarity index 100% rename from gateways/custom/gitlab/validate_test.go rename to gateways/community/gitlab/validate_test.go diff --git a/gateways/custom/storagegrid/Dockerfile b/gateways/community/storagegrid/Dockerfile similarity index 100% rename from gateways/custom/storagegrid/Dockerfile rename to gateways/community/storagegrid/Dockerfile diff --git a/gateways/custom/storagegrid/cmd/main.go b/gateways/community/storagegrid/cmd/main.go similarity index 92% rename from gateways/custom/storagegrid/cmd/main.go rename to gateways/community/storagegrid/cmd/main.go index 76c9f7f5a8..e103870c60 100644 --- a/gateways/custom/storagegrid/cmd/main.go +++ b/gateways/community/storagegrid/cmd/main.go @@ -19,7 +19,7 @@ package main import ( "github.com/argoproj/argo-events/common" "github.com/argoproj/argo-events/gateways" - "github.com/argoproj/argo-events/gateways/custom/storagegrid" + "github.com/argoproj/argo-events/gateways/community/storagegrid" ) func main() { diff --git a/gateways/custom/storagegrid/config.go b/gateways/community/storagegrid/config.go similarity index 100% rename from gateways/custom/storagegrid/config.go rename to gateways/community/storagegrid/config.go diff --git a/gateways/custom/storagegrid/start.go b/gateways/community/storagegrid/start.go similarity index 100% rename from gateways/custom/storagegrid/start.go rename to gateways/community/storagegrid/start.go diff --git a/gateways/custom/storagegrid/validate.go b/gateways/community/storagegrid/validate.go similarity index 100% rename from gateways/custom/storagegrid/validate.go rename to gateways/community/storagegrid/validate.go diff --git a/gateways/custom/storagegrid/validate_test.go b/gateways/community/storagegrid/validate_test.go similarity index 100% rename from gateways/custom/storagegrid/validate_test.go rename to gateways/community/storagegrid/validate_test.go diff --git a/gateways/core/resource/config.go b/gateways/core/resource/config.go index 5077f8d409..76047545a4 100644 --- a/gateways/core/resource/config.go +++ b/gateways/core/resource/config.go @@ -31,7 +31,6 @@ type ResourceEventSourceExecutor struct { } // resource refers to a dependency on a k8s resource. -// +k8s:openapi-gen=true type resource struct { // Namespace where resource is deployed Namespace string `json:"namespace"` @@ -40,18 +39,15 @@ type resource struct { // Version of the source Version string `json:"version"` // Group of the resource - // +k8s:openapi-gen=false metav1.GroupVersionKind `json:",inline"` } // ResourceFilter contains K8 ObjectMeta information to further filter resource event objects -// +k8s:openapi-gen=true type ResourceFilter struct { Prefix string `json:"prefix,omitempty"` Labels map[string]string `json:"labels,omitempty"` Annotations map[string]string `json:"annotations,omitempty"` - // +k8s:openapi-gen=false - CreatedBy metav1.Time `json:"createdBy,omitempty"` + CreatedBy metav1.Time `json:"createdBy,omitempty"` } func parseEventSource(es string) (*resource, error) { diff --git a/hack/k8s/manifests/argo-events-cluster-roles.yaml b/hack/k8s/manifests/argo-events-cluster-roles.yaml index c12a754af2..be11347ab8 100644 --- a/hack/k8s/manifests/argo-events-cluster-roles.yaml +++ b/hack/k8s/manifests/argo-events-cluster-roles.yaml @@ -5,7 +5,7 @@ metadata: roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole - name: argo-events-cluster-role + name: argo-events-role subjects: - kind: ServiceAccount name: argo-events-sa @@ -14,7 +14,7 @@ subjects: apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: - name: argo-events-cluster-role + name: argo-events-role rules: - apiGroups: - apiextensions.k8s.io diff --git a/hack/k8s/manifests/gateway-controller-deployment.yaml b/hack/k8s/manifests/gateway-controller-deployment.yaml index a67e4c4ee3..8e269085f5 100644 --- a/hack/k8s/manifests/gateway-controller-deployment.yaml +++ b/hack/k8s/manifests/gateway-controller-deployment.yaml @@ -13,7 +13,7 @@ spec: serviceAccountName: argo-events-sa containers: - name: gateway-controller - image: argoproj/gateway-controller:v0.6 + image: argoproj/gateway-controller imagePullPolicy: Always env: - name: GATEWAY_NAMESPACE diff --git a/hack/k8s/manifests/sensor-controller-configmap.yaml b/hack/k8s/manifests/sensor-controller-configmap.yaml index b4da0b62c8..63a2459cd6 100644 --- a/hack/k8s/manifests/sensor-controller-configmap.yaml +++ b/hack/k8s/manifests/sensor-controller-configmap.yaml @@ -8,4 +8,4 @@ metadata: data: config: | instanceID: argo-events - namespace: argo-events + namespace: argo-events \ No newline at end of file diff --git a/hack/k8s/manifests/sensor-controller-deployment.yaml b/hack/k8s/manifests/sensor-controller-deployment.yaml index f851101b57..343eec737d 100644 --- a/hack/k8s/manifests/sensor-controller-deployment.yaml +++ b/hack/k8s/manifests/sensor-controller-deployment.yaml @@ -13,7 +13,7 @@ spec: serviceAccountName: argo-events-sa containers: - name: sensor-controller - image: argoproj/sensor-controller:v0.6 + image: argoproj/sensor-controller imagePullPolicy: Always env: - name: SENSOR_NAMESPACE diff --git a/hack/update-codegen.sh b/hack/update-codegen.sh index 5ad8540629..2c90f2204f 100644 --- a/hack/update-codegen.sh +++ b/hack/update-codegen.sh @@ -21,6 +21,7 @@ set -o pipefail CODEGEN_PKG="../vendor/k8s.io/code-generator/" + bash -x ${CODEGEN_PKG}/generate-groups.sh "deepcopy,client,informer,lister" \ github.com/argoproj/argo-events/pkg/client/sensor github.com/argoproj/argo-events/pkg/apis \ "sensor:v1alpha1" \ @@ -30,3 +31,4 @@ bash -x ${CODEGEN_PKG}/generate-groups.sh "deepcopy,client,informer,lister" \ github.com/argoproj/argo-events/pkg/client/gateway github.com/argoproj/argo-events/pkg/apis \ "gateway:v1alpha1" \ --go-header-file ./custom-boilerplate.go.txt + diff --git a/pkg/apis/sensor/v1alpha1/build/generated.json b/pkg/apis/sensor/v1alpha1/build/generated.json deleted file mode 100644 index 76e4554e1a..0000000000 --- a/pkg/apis/sensor/v1alpha1/build/generated.json +++ /dev/null @@ -1,646 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "title": "Argo-Events", - "version": "1.0" - }, - "paths": {}, - "definitions": { - "v1alpha1.ArtifactLocation": { - "description": "ArtifactLocation describes the source location for an external artifact", - "properties": { - "configmap": { - "$ref": "#/definitions/v1alpha1.ConfigmapArtifact" - }, - "file": { - "$ref": "#/definitions/v1alpha1.FileArtifact" - }, - "inline": { - "type": "string" - }, - "s3": { - "$ref": "#/definitions/v1alpha1.S3Artifact" - }, - "url": { - "$ref": "#/definitions/v1alpha1.URLArtifact" - } - } - }, - "v1alpha1.ConfigmapArtifact": { - "description": "ConfigmapArtifact contains information about artifact in k8 configmap", - "required": [ - "name", - "namespace", - "key" - ], - "properties": { - "key": { - "description": "Key within configmap data which contains trigger resource definition", - "type": "string" - }, - "name": { - "description": "Name of the configmap", - "type": "string" - }, - "namespace": { - "description": "Namespace where configmap is deployed", - "type": "string" - } - } - }, - "v1alpha1.Data": { - "required": [ - "filters" - ], - "properties": { - "escalationPolicy": { - "description": "EscalationPolicy is the escalation to trigger in case the signal filter fails", - "$ref": "#/definitions/v1alpha1.EscalationPolicy" - }, - "filters": { - "description": "filter constraints", - "type": "array", - "items": { - "$ref": "#/definitions/v1alpha1.DataFilter" - } - } - } - }, - "v1alpha1.DataFilter": { - "description": "DataFilter describes constraints and filters for event data Regular Expressions are purposefully not a feature as they are overkill for our uses here See Rob Pike's Post: https://commandcenter.blogspot.com/2011/08/regular-expressions-in-lexing-and.html", - "required": [ - "path", - "type", - "value" - ], - "properties": { - "escalationPolicy": { - "description": "EscalationPolicy is the escalation to trigger in case the signal filter fails", - "$ref": "#/definitions/v1alpha1.EscalationPolicy" - }, - "path": { - "description": "Path is the JSONPath of the event's (JSON decoded) data key Path is a series of keys separated by a dot. A key may contain wildcard characters '*' and '?'. To access an array value use the index as the key. The dot and wildcard characters can be escaped with '\\'. See https://github.com/tidwall/gjson#path-syntax for more information on how to use this.", - "type": "string" - }, - "type": { - "description": "Type contains the JSON type of the data", - "type": "string" - }, - "value": { - "description": "Value is the expected string value for this key Booleans are pased using strconv.ParseBool() Numbers are parsed using as float64 using strconv.ParseFloat() Strings are taken as is Nils this value is ignored", - "type": "string" - } - } - }, - "v1alpha1.EscalationPolicy": { - "description": "EscalationPolicy describes the policy for escalating sensors in an Error state. An escalation policy is associated with signal filter. Whenever a signal filter fails escalation will be triggered", - "required": [ - "name", - "level", - "message" - ], - "properties": { - "level": { - "description": "Level is the degree of importance", - "type": "string" - }, - "message": { - "description": "need someway to progressively get more serious notifications", - "type": "string" - }, - "name": { - "description": "Name is name of the escalation policy This is referred by signal filter/s", - "type": "string" - } - } - }, - "v1alpha1.Event": { - "description": "Event is a data record expressing an occurrence and its context. Adheres to the CloudEvents v0.1 specification", - "required": [ - "context", - "payload" - ], - "properties": { - "context": { - "$ref": "#/definitions/v1alpha1.EventContext" - }, - "payload": { - "type": "string", - "format": "byte" - } - } - }, - "v1alpha1.EventContext": { - "description": "EventContext contains metadata that provides circumstantial information about the occurrence.", - "required": [ - "eventType", - "eventTypeVersion", - "cloudEventsVersion", - "source", - "eventID", - "schemaURL", - "contentType" - ], - "properties": { - "cloudEventsVersion": { - "description": "The version of the CloudEvents specification which the event uses. Enables the interpretation of the context.", - "type": "string" - }, - "contentType": { - "description": "Content type of the data attribute value. Enables the data attribute to carry any type of content, whereby format and encoding might differ from that of the chosen event format. For example, the data attribute may carry an XML or JSON payload and the consumer is informed by this attribute being set to \"application/xml\" or \"application/json\" respectively.", - "type": "string" - }, - "escalationPolicy": { - "description": "EscalationPolicy is the name of escalation policy to trigger in case the signal filter fails", - "$ref": "#/definitions/v1alpha1.EscalationPolicy" - }, - "eventID": { - "description": "ID of the event. The semantics are explicitly undefined to ease the implementation of producers. Enables deduplication. Must be unique within scope of producer.", - "type": "string" - }, - "eventType": { - "description": "The type of occurrence which has happened. Often this attribute is used for routing, observability, policy enforcement, etc. should be prefixed with a reverse-DNS name. The prefixed domain dictates the organization which defines the semantics of this event type. ex: com.github.pull.create", - "type": "string" - }, - "eventTypeVersion": { - "description": "The version of the eventType. Enables the interpretation of data by eventual consumers, requires the consumer to be knowledgeable about the producer.", - "type": "string" - }, - "extensions": { - "description": "This is for additional metadata and does not have a mandated structure. Enables a place for custom fields a producer or middleware might want to include and provides a place to test metadata before adding them to the CloudEvents specification.", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "schemaURL": { - "description": "A link to the schema that the data attribute adheres to. Must adhere to the format specified in RFC 3986.", - "$ref": "#/definitions/v1alpha1.URI" - }, - "source": { - "description": "This describes the event producer.", - "$ref": "#/definitions/v1alpha1.URI" - } - } - }, - "v1alpha1.EventWrapper": { - "description": "EventWrapper wraps an event with an additional flag to check if we processed this event already", - "required": [ - "event", - "seen" - ], - "properties": { - "event": { - "$ref": "#/definitions/v1alpha1.Event" - }, - "seen": { - "type": "boolean" - } - } - }, - "v1alpha1.FileArtifact": { - "description": "FileArtifact contains information about an artifact in a filesystem", - "properties": { - "path": { - "type": "string" - } - } - }, - "v1alpha1.GroupVersionKind": { - "description": "GroupVersionKind unambiguously identifies a kind. It doesn't anonymously include GroupVersion to avoid automatic coercion. It doesn't use a GroupVersion to avoid custom marshalling.", - "required": [ - "group", - "version", - "kind" - ], - "properties": { - "group": { - "type": "string" - }, - "kind": { - "type": "string" - }, - "version": { - "type": "string" - } - } - }, - "v1alpha1.NodeStatus": { - "description": "NodeStatus describes the status for an individual node in the sensor's FSM. A single node can represent the status for signal or a trigger.", - "required": [ - "id", - "name", - "displayName", - "type", - "phase" - ], - "properties": { - "displayName": { - "description": "DisplayName is the human readable representation of the node", - "type": "string" - }, - "id": { - "description": "ID is a unique identifier of a node within a sensor It is a hash of the node name", - "type": "string" - }, - "latestEvent": { - "description": "LatestEvent stores the last seen event for this node", - "$ref": "#/definitions/v1alpha1.EventWrapper" - }, - "message": { - "description": "store data or something to save for signal notifications or trigger events", - "type": "string" - }, - "name": { - "description": "Name is a unique name in the node tree used to generate the node ID", - "type": "string" - }, - "phase": { - "description": "Phase of the node", - "type": "string" - }, - "type": { - "description": "Type is the type of the node", - "type": "string" - } - } - }, - "v1alpha1.ResourceObject": { - "description": "ResourceObject is the resource object to create on kubernetes", - "required": [ - "group", - "version", - "kind", - "namespace", - "source", - "parameters" - ], - "properties": { - "group": { - "type": "string" - }, - "kind": { - "type": "string" - }, - "labels": { - "description": "Map of string keys and values that can be used to organize and categorize (scope and select) objects. This overrides any labels in the unstructured object with the same key.", - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "namespace": { - "description": "Namespace in which to create this object optional defaults to the service account namespace", - "type": "string" - }, - "parameters": { - "description": "Parameters is the list of resource parameters to pass in the object", - "type": "array", - "items": { - "$ref": "#/definitions/v1alpha1.ResourceParameter" - } - }, - "source": { - "description": "Source of the K8 resource file(s)", - "$ref": "#/definitions/v1alpha1.ArtifactLocation" - }, - "version": { - "type": "string" - } - } - }, - "v1alpha1.ResourceParameter": { - "description": "ResourceParameter indicates a passed parameter to a service template", - "required": [ - "src", - "dest" - ], - "properties": { - "dest": { - "description": "Dest is the JSONPath of a resource key. A path is a series of keys separated by a dot. The colon character can be escaped with '.' The -1 key can be used to append a value to an existing array. See https://github.com/tidwall/sjson#path-syntax for more information about how this is used.", - "type": "string" - }, - "src": { - "description": "Src contains a source reference to the value of the resource parameter from a signal event", - "$ref": "#/definitions/v1alpha1.ResourceParameterSource" - } - } - }, - "v1alpha1.ResourceParameterSource": { - "description": "ResourceParameterSource defines the source for a resource parameter from a signal event", - "required": [ - "signal", - "path" - ], - "properties": { - "path": { - "description": "Path is the JSONPath of the event's (JSON decoded) data key Path is a series of keys separated by a dot. A key may contain wildcard characters '*' and '?'. To access an array value use the index as the key. The dot and wildcard characters can be escaped with '\\'. See https://github.com/tidwall/gjson#path-syntax for more information on how to use this.", - "type": "string" - }, - "signal": { - "description": "Signal is the name of the signal for which to retrieve this event", - "type": "string" - }, - "value": { - "description": "Value is the default literal value to use for this parameter source This is only used if the path is invalid. If the path is invalid and this is not defined, this param source will produce an error.", - "type": "string" - } - } - }, - "v1alpha1.RetryStrategy": { - "description": "RetryStrategy represents a strategy for retrying operations" - }, - "v1alpha1.S3Artifact": { - "description": "S3Artifact contains information about an artifact in S3", - "properties": { - "bucket": { - "type": "string" - }, - "endpoint": { - "type": "string" - }, - "event": { - "type": "string" - }, - "filter": { - "$ref": "#/definitions/v1alpha1.S3Filter" - }, - "insecure": { - "type": "boolean" - }, - "key": { - "type": "string" - }, - "region": { - "type": "string" - } - } - }, - "v1alpha1.S3Bucket": { - "description": "S3Bucket contains information for an S3 Bucket", - "properties": { - "bucket": { - "type": "string" - }, - "endpoint": { - "type": "string" - }, - "insecure": { - "type": "boolean" - }, - "region": { - "type": "string" - } - } - }, - "v1alpha1.S3Filter": { - "description": "S3Filter represents filters to apply to bucket nofifications for specifying constraints on objects", - "required": [ - "prefix", - "suffix" - ], - "properties": { - "prefix": { - "type": "string" - }, - "suffix": { - "type": "string" - } - } - }, - "v1alpha1.Sensor": { - "description": "Sensor is the definition of a sensor resource", - "required": [ - "spec", - "status" - ], - "properties": { - "spec": { - "$ref": "#/definitions/v1alpha1.SensorSpec" - }, - "status": { - "$ref": "#/definitions/v1alpha1.SensorStatus" - } - } - }, - "v1alpha1.SensorList": { - "description": "SensorList is the list of Sensor resources", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/definitions/v1alpha1.Sensor" - } - } - } - }, - "v1alpha1.SensorSpec": { - "description": "SensorSpec represents desired sensor state", - "required": [ - "signals", - "triggers" - ], - "properties": { - "imagePullPolicy": { - "description": "ImagePullPolicy determines the when the image should be pulled from docker repository", - "type": "string" - }, - "imageVersion": { - "description": "ImageVersion is the sensor image version to run", - "type": "string" - }, - "repeat": { - "description": "Repeat is a flag that determines if the sensor status should be reset after completion. NOTE: functionality is currently experimental and part of an initiative to define a more concrete pattern or cycle for sensor repetition.", - "type": "boolean" - }, - "serviceAccountName": { - "description": "ServiceAccountName required for role based access", - "type": "string" - }, - "signals": { - "description": "Signals is a list of the things that this sensor is dependent on. These are the inputs to this sensor.", - "type": "array", - "items": { - "$ref": "#/definitions/v1alpha1.Signal" - } - }, - "triggers": { - "description": "Triggers is a list of the things that this sensor evokes. These are the outputs from this sensor.", - "type": "array", - "items": { - "$ref": "#/definitions/v1alpha1.Trigger" - } - } - } - }, - "v1alpha1.SensorStatus": { - "description": "SensorStatus contains information about the status of a sensor.", - "required": [ - "phase" - ], - "properties": { - "completionCount": { - "description": "CompletionCount is the count of sensor's successful runs.", - "type": "integer", - "format": "int32" - }, - "message": { - "description": "Message is a human readable string indicating details about a sensor in its phase", - "type": "string" - }, - "nodes": { - "description": "Nodes is a mapping between a node ID and the node's status it records the states for the FSM of this sensor.", - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/v1alpha1.NodeStatus" - } - }, - "phase": { - "description": "Phase is the high-level summary of the sensor", - "type": "string" - } - } - }, - "v1alpha1.Signal": { - "description": "Signal describes a dependency", - "required": [ - "name" - ], - "properties": { - "deadline": { - "description": "Deadline is the duration in seconds after the StartedAt time of the sensor after which this signal is terminated. Note: this functionality is not yet respected, but it's theoretical behavior is as follows: This trumps the recurrence patterns of calendar signals and allows any signal to have a strict defined life. After the deadline is reached and this signal has not in a Resolved state, this signal is marked as Failed and proper escalations should proceed.", - "type": "integer", - "format": "int64" - }, - "filters": { - "description": "Filters and rules governing tolerations of success and constraints on the context and data of an event", - "$ref": "#/definitions/v1alpha1.SignalFilter" - }, - "name": { - "description": "Name is a unique name of this dependency", - "type": "string" - } - } - }, - "v1alpha1.SignalFilter": { - "description": "SignalFilter defines filters and constraints for a signal.", - "required": [ - "name" - ], - "properties": { - "context": { - "description": "Context filter constraints with escalation", - "$ref": "#/definitions/v1alpha1.EventContext" - }, - "data": { - "description": "Data filter constraints with escalation", - "$ref": "#/definitions/v1alpha1.Data" - }, - "name": { - "description": "Name is the name of signal filter", - "type": "string" - }, - "time": { - "description": "Time filter on the signal with escalation", - "$ref": "#/definitions/v1alpha1.TimeFilter" - } - } - }, - "v1alpha1.TimeFilter": { - "description": "TimeFilter describes a window in time. Filters out signal events that occur outside the time limits. In other words, only events that occur after Start and before Stop will pass this filter.", - "properties": { - "escalationPolicy": { - "description": "EscalationPolicy is the escalation to trigger in case the signal filter fails", - "$ref": "#/definitions/v1alpha1.EscalationPolicy" - }, - "start": { - "description": "Start is the beginning of a time window. Before this time, events for this signal are ignored and format is hh:mm:ss", - "type": "string" - }, - "stop": { - "description": "StopPattern is the end of a time window. After this time, events for this signal are ignored and format is hh:mm:ss", - "type": "string" - } - } - }, - "v1alpha1.Trigger": { - "description": "Trigger is an action taken, output produced, an event created, a message sent", - "required": [ - "name", - "retryStrategy" - ], - "properties": { - "message": { - "description": "Message describes a message that will be sent on a queue", - "type": "string" - }, - "name": { - "description": "Name is a unique name of the action to take", - "type": "string" - }, - "resource": { - "description": "Resource describes the resource that will be created by this action", - "$ref": "#/definitions/v1alpha1.ResourceObject" - }, - "retryStrategy": { - "description": "RetryStrategy is the strategy to retry a trigger if it fails", - "$ref": "#/definitions/v1alpha1.RetryStrategy" - } - } - }, - "v1alpha1.URI": { - "description": "URI is a Uniform Resource Identifier based on RFC 3986", - "required": [ - "scheme", - "user", - "password", - "host", - "port", - "path", - "query", - "fragment" - ], - "properties": { - "fragment": { - "type": "string" - }, - "host": { - "type": "string" - }, - "password": { - "type": "string" - }, - "path": { - "type": "string" - }, - "port": { - "type": "integer", - "format": "int32" - }, - "query": { - "type": "string" - }, - "scheme": { - "type": "string" - }, - "user": { - "type": "string" - } - } - }, - "v1alpha1.URLArtifact": { - "description": "URLArtifact contains information about an artifact at an http endpoint.", - "properties": { - "path": { - "type": "string" - }, - "verifyCert": { - "type": "boolean" - } - } - } - } - } \ No newline at end of file diff --git a/sensors/event-handler_test.go b/sensors/event-handler_test.go index 0720c2edf0..fb8e23a71d 100644 --- a/sensors/event-handler_test.go +++ b/sensors/event-handler_test.go @@ -44,9 +44,13 @@ spec: deploySpec: containers: - name: "sensor" - image: "metalgearsolid/sensor:v0.6.1" + image: "argoproj/sensor" imagePullPolicy: Always serviceAccountName: argo-events-sa + eventProtocol: + type: "HTTP" + http: + port: "9300" dependencies: - name: test-gateway:test triggers: From 573a141d23c31746c370238537d3202945c8d2db Mon Sep 17 00:00:00 2001 From: vpage Date: Sat, 26 Jan 2019 20:29:37 -0500 Subject: [PATCH 17/22] Updating docs for v0.7 --- docs/architecture.png | Bin 0 -> 122032 bytes docs/gateway-protocol.md | 276 +++++++++++++++++++++ docs/sensor-protocol.md | 519 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 795 insertions(+) create mode 100644 docs/architecture.png create mode 100644 docs/gateway-protocol.md create mode 100644 docs/sensor-protocol.md diff --git a/docs/architecture.png b/docs/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..f2de1b75e058b7ce9f2cb576000e2094a302f733 GIT binary patch literal 122032 zcmcG$WmHsa*gh^G4I&^hA|=v2NGJ`0A|W|2bPYZ9(2ao7N)FxK-Q6wSA`s+e5O&x!DMC_5wJ8@MP6l5}{52f1N z-AcW)J0E01<}hZ=QjE5W=B3m#+zkD7VifdS8lRn)l(deIPYHsr@_k5DBZ+99zI`l# zlb^VJZF1dwaxd)c{5^5lx*`#2&DVe3!8tLK^yXx7c$x7K?$9&TNn(qxjiTQ6f4H5a zqx*TTF(e*SIpk?|S(GS^RNxWuF2LAjG9T2_r2q#F<#m;=2{Ng*RtaC*|h=k1pn>NOac8g z0QtiOy+Qy&6Y3)pi4TMorelc|fKAKQ`p7Bqlf`l@NSg40-wIA1N7jc9y)4v{qSt!6 zjYf`Euc+R)n!l(@jt{hSSTj;Q{j8LBd!mn#hu;uEm;NZWUF&JLZxIsHVjDFc4Iu^< zz%WJ{@95@(D?U(CbSZ1@&RUI~HMFg9J)ZZe(n7VcA^h+j@a~Vz*`jMEqYmUHW8DYf z(@cCH(X8>t1HP}$6ck+c$-5COA}D0eG6HG+jjWjHrQJ0*vSQZm2`fN-MzVlhPmaAM}fB``jcLF;p z#*w3_fOd-X^Ja6ctrMb1z}bHa^(9pl>*>j~!|BVrL5+q-$!MbBT560|pgrplR}>7a zpj&!XV|x81L1K?8=9@OyA80nt%qUPreE?k~t+>5JCd~cA69ViD%tPMNE}^xQ<~L zVziwzZ>mAJy_IYXk_~`paP+tD%tu_NF5Sqi`r1I|W`j7&yvo>uAU46=&R5?`V# zf)p?E`q1Ef)yK?C{(5coG?KrW6$K&B`F-V%DbmJ9lTOE5=4jT7ESGQ#)c1ezW+&ri z{(o#*E_f&@bYv+lG%YktE(2(ZSe1_C{!SQ$9U_5|{|Mw;VMguWAPd3z6nHB4A~8`C z*2`}LZM1*eXuRbpTrErMz*`zf&!*>F&V^?@VmzCImOMjgjEtsyfxUNd%fHj|%zsUB zY;<5hjcq+H9Wx30lmCGO15=~(n?-b>6EOQz$4Q!7c50{*s)FCOKI+b5Hce(Tp)o3~ z$4WNG(}aY$}gd5+8#88|7nI$RWMNum$>yGbnBo__-=R4(7Av*yu#0 zjosRy>g3|Sz7%HpO)=3B^AZ|=IY5Oo!kP9t9|0N=Vm+38W~t$Nj|;_3J}i~S@S5pBVz?sCz<$u_>dzX0$30wK66F#LH19JH$ev`)ZaB1 zyTMb*)@(0nt^D*lfQo(kp7hlWmelqOp_RJp`}q}#l~p#$!a|`05AaPV$mvbomtbr3PS_%0eVol z(4GMYe*Dg-H22!|aETbJN*da}E3Prf*lq8n zFi)K*gl{ssF)4c_LP95B4|R&x;hb6VqA=qrY5NjQCrJRFo|{Qo3Bq#a+SYbh2EYbE zW>knmbfi_`^|%I9eLnqTXBbj~@n}G23rV*|h}9^@R4qmeffAmv)P4yoPoC2YTqVIO z4-{h)7$vmSk6J7Xt&r+(xcM7(#E}%AIb&CtWvIq=ufIt38f$Kg6Xvnc zm&&Dw&MGSQd=jM_^{Yrz%0oK3;QU&xRBT)t_?3TmI_CKy6HRPsFqk-r<#MP^(ef}Esa-cQRraR8mE43i_eJi$efwUvnj07ov}+(^ujT}LHef!0 z&58Q;l||`@3I$9K@@$?uIT!JM=0`b`s`SMSdIp~iD+Dk_QtV)?Dg0mjk_IQS<*Bno zotYlRms>xTn;EUPOmfnl|35@G|1JK1iIM()T1B5)m1Y+6(6zK>vje-=w5nfomK(r; zYj0HVDz4_L8*?B)weSq1|0jN-Y}_+1YZ+$uj%H1));E8|Q;~n6?W>6trJdyqOqk5G z-XM+m8@Z>lRL{E%J%{~t#h)^Ca%s1vR@w!4f9fHQa$`^6Ib3vLFE?F;*N*=u*aTS= ze*fWYE8H1(L?hb#b_}{+4cGZ54VH-1Jg2TYv0obt(bq0Iwc`!SZjuvHvhZ@%pJgQ# zEu;S}aqfk_h^A{$uXzPe3`L6s&=JyKXc7&tX4C1{?mzkJq8P zhoF`>Z%UtcUz6XzD_tzmnEup3bFOpHswA!G79eviH}q3&;Ff|kYQ&`;{O32^{}S~@ z8bM)Be*2}VJBe}CaQ(OTmn(&(zkR#e(x^3L@3^FidE)Ty1J1(9z!K#vTNg!_zXNWU zo=)c$9y2j)G}UJ#%Bdr?P7GM#eeI&Q0ob{IWonvEJQ5)137KW z`C>iGu3GNfI@N;Kt3F&1&?rT`WtMdpr)F`f+c;aI0zUgB0K zHt97=B6nIuE3ALh^3n+3P!kQPuj7>aI3!L#E=G5*_8ODn}-0u-ki!3PFu!^`4GODZp7vmv+R2bGK_M+mxx`PJ}x zAten%YL44vdGHnHf@=B8;%5=hdw>UhoSgL|m@!uLAvXV_qk9Z0tR>s9w4qb@#^eAl zu+ivC#2AlNFAvNGcg(iHs499mIPY;#RJO`BWFK6g~3Mn8c;%or8Kunq-|*3}KWj|x@P z2sKmb{d-QdeVZjwM)7KXj&egD`yYM8_4g7Ys++^=F`DCRI3#ge_1a!23<=)v2Ny!+ z!*&OUzs#B6;vzqbP!{1;UL-OP0vL$q*OnIM^Gcval1@nlr_>`r(piRzFPfuY<7PXm zqmXm(I0|B=+=+-X9A0MNP!-(Y57tpJHDWv>Q`vdVdKF zU467Tzt!Ikd3^0C&=bDz9m75!SymfoQ&o=`=)(f7c&P!aHtAz(N}2}34}MIC@BJ8& zzOXX&$FVQg0WAW#d~o?<7cd9;=RTt&ki*#&P%3c8z&nhkVd0`I`|9HP*PfNJn`#Ik z3z206mXX1)%hFk7-2G~xZKXiV&wnS8mo=-)7yN5S5&E8!r=S%-!D7f(jq>)g+u9}!a}nfoiZtb8_SxN=gJzD6V<&H7k}sJUmi29f6V0r%C6IG@U$ zRbsBF|2U|bNuCRf(+Wk0#WmBY8dgk=~ zYEJ5$R8~d;NL_MfI`S^Bu3}iA1*5t{>Kg$1bnWUp%Q*hNJ3hu(sBKBXHqkt-d5&SlB(;(?OM*V)pm5#0I1cMn+K^ z7D#PjsBQlEs^RcQ8j7fQyY=<1%(;T2yxzZPTGEzM*akAml(JcG0Auo`_8)`PU|EpI zp02#o>P?^cWR*3!8>GNFSS~*J680LtvFRAVqO|L(FS$F*RYgNzK?0Yzq)>MrZR9ez ziNd9R>pVoq&j#`R^Q^lImT6cQoB zRu76XkzSz8Ma+b=klhcr#O9L87QQCdEe`Vw@3P4)qnixt%^jjE@tyB+=Av&3DCXMw z&wB|*s>XxW@;j@Gi~xK$dQFQP&Z2^IcZA7@vj6$WSsoIzxd)xZ8$fsz%3Lnd3yTD> z`Wt=?;8l3X`mYUsgnhN1+61_&A^S|6Ka*g0=yEN7Z&w0=>{4_Dp%wIgxooDhvLJFR zVGk#QOKqH7O;FjZy4L_)@;6q={3{m4HKsi$#We1DBqVVsR(j)GCq;TI=W|ZG?ZWZ0 zTva3W03ovYZv$8yy)Rl`dlxrX7YV4B*># zn-mvUp*7%b&~^`1g>SQOY7C|$zj~OU&xqP=1=_MgJ^row%&tE(1Ms-CH@!gUI@QD| z2*zPf2I{}MT0NN08cKbIi)tmKAwF#*JZKmK;j-YhXZc73sy0GeYJukM6r2VGo-Ymf zRx?V@#$|MJ2lXo6%Te&(Vr#{o@L$W{SG`fzJlwWluuNXqDrTu;3dM{wdh9+qGcG`Y z+=Rf&hlWrS8x4#G@`_C&zq}pf4U=<|)6y|4WuG@YWaq323nc}4)Y(VHcvKCI0LJ@A zI-e@&f~~;i0vKEdDxhN!5ktZBY7{yJ3p^nwjAY|{y}m1Zcgh+}P=ppo3B~6Bto81g z_a80lkE*7*4(qQqx`I+*Y3SKxM)T4}S8lY#om5}qiw#zc@s{2VEi%UTX&ZuLHbH>W zigz#B8*_DkhT;v%nP|AS`P=r>CRK`VE0jkd!MF3)IH1s zf?~=_)p{<;+|P#a95~ysbmhaxJ{*9e9F+gHfRVdEgTY=NOi!(n0_)qi!JTO> z&mM=)*t?87JPSO^ooRg+c=Y%XxD0x^vi=XSRe7N&jN<7E7ly>ddHRPgyJnRKMotYD z()ad)z`V;q!B*(t03V+~lzQDyokDF{X)Yyw@hLG}p78X$i9GjL`mZ}ttep7=XQ_>T zV>Y@?+w8}-vs&u7*V+tVnHX>1(ct-?nB(m)c|8`&B3nQ2>oY(WROSdTnB+>M&WNaF z`Xhi}pYvDf8%gcWwby{l_fQya9-o@W8HKpQl80zUSwX!uRF&tDs$^eUp*9v|P6ruV z<Vi+M|#`pPF4P_}b6HuJ7HLn%vpTh}dCAU~tS3<18OfOBgL% z$%n`_S=o}Dk2b%J&{YOsz1`*(Ykd2fL>_aCW~f8TWLi#21c6+CDIbpRLd02>x=nM26|{-R+Zd-e+_$2$xOjHr}HNdYuJ1@^fy^yS%{XTJwbF zm(0v^&Hw0(Eq;Q`q8_b`JIr69x07(_ZH@|j;Tw0&a&Zr9d(F@FVQv%RY%m|E;@Yk4 zXZq+{498C;otk|X-3Wj-Sks)f?|h1ix2ONr5x@=9mNYae`UnZdX#^S_pN!7}D(Qf6yGdMJ7=RC{7n z;nQ1=^qXUTnSG{p#ZO)ShVI^)QvK5wxK%Eky6d|yO*FP)vx^J6d9Q~zy!pJXAvtQ@ zty29^&-8lfJ_V-3-Ai;VPu_8-ElTD;PG}_XG*ckjmkELF3Nf7@Bshp2iV3B8g2dTU z6iTkaw;E~=%o3^OnFp6Xd4Gh|e~>H8q+W~$&wHz>r8eGf1UQe??FR+8rp&XXdj_I0<~w7n zTAoB&S)u=AX`;0@G{U*!wvB`Hh>X}k`Z+oLK z5Wcl1N6|@a>N{*G)<4P>I66y-`F&0n7ba?>IoDosvY;td)ZEP?m;iAqcd20PiP}bs z(&q7J(|?)BA6t|o=!PBzRyTY!x^<~E8MgbX!?uPw-+$FyEMJ{Q|)*;U_GvV#4e@r6{{n;#x$7Q$3X}abYUsCt)Dd|X1 zkQ0G4lCRPAoiOo~(pJHzCtX82A-+PzTS8|LFRStb3iitViF5l_7C{e9Q)SI2_$%&E zyp{H7%D^9VXy!|GfjLp;9$9z>M}iCSt}#peb;qO3e7}N$e&sZ-p89qTW3>RKrM`J` zK-AQn0+l_hO6v<~rEB$~ug=LnXKGP}>2~S5XNOjU|CCe{^-{|U`Es{3m&Pj`KnFiu z+GJ!N$Z8TUjxQI>h?I#vE^6P8@4RNeUJpvG4Q9#lSnN()ZasE5+SUlT?Zsc?2;R+Y z{3qWY&T1=hCf<%2CrPwhHlZWuttzm(mOiOTr=ExL9Cn2v-}i+7Ms;oZH^T>(s>xO^o1gkhmQuG>|*_wqcuCfj(bdc^1 zk@WkyhP~ek%G-}yyVI6rO^$B&LFxW8a-BzW0RotEdKReWFhFT%*^jfr+OSDNT2rp) zkNta}@$}1+i=_~Uddv0GhbrjGsgPEbhVsKz1+$D_j+}(hl{1QF9#BQE-{|8kjWB8$ zlvWqn>}T!O8PhqVUo=mW@^0CaThM3>YuW!N6sbdP{N$Vb5R4qz*Tgv85^heSpa?TEf8gqYC2=e)Zsap-R=}x$u;zc1SZ&Iy@2BCD5j`Vo1u~Bm(u}w6-qp$z~ z#QQx4sa9Hb(<#)RzrI4~8bA6d8R4gHmw~FQ`EhaCr+2fK zm)QGS!b+fkc7})oV*sFu0iQ!CT*?VeXgv%GRpq%rC*)%x*oo1}!3I5$)=B8G) zxK1AwXy`QQ1%>L1V<-<*M#S9@G7Pb2X-_;C*NJ}~5yDucXQySUe)(Bg*~Qu-v)8J%23^$)^@Y=nY+*3>n| zf~LHeV-Hp|c;^})>RH&%cwj7^B3YGrrEAjJ|1_3TdoN7ZpQ&IYpX9( zm@JI%rltp-n@Hb0$^M|p?@&zqy&q=$G^WBl8nKNM|e6l!#aA_C;ZWK zEOP16_=6WtHc|4mwt;8XiAK!}kcFOKzt0akf}mRirY<##!btg4!Xm^01S`s}k)x)^ zYcsHnBful|A5$Hxz%fQnZhmx#@5xSjgZ@T~Igh3;W><5$3r%{|e{-GvN~53ApSc`L zc930J0i8QVFgehg6un=9M!v~EE+`l9mjN!9pV3NcJFoq2X_StepPIB_HodEFiVmhla!bQ@q7ySp z7+!rS1IBiVXxva#_<9>Z?Ux9y4kc7|cNwqp@uph*wqrKu2v|7`R4j1$x9;>{X;+nY zXVtrnhbBK0U51mmY5cJar9dR^Q`Y;9q$+s_(+S&$9V4WlLKR|U?j^Tt^9@IuSBduW z7O?i_+Gxi7tt}tr5}lX5+e~F|J!L&_{*BHo`%Tx>Xu2|rf<5J$DOc5$P31y~Z$SBC zDn7ViaQXUBd@lJX+NU_e4M007zaO{m4lwJ)bYJDRQ~}UVxg;)>M>PmESsg|8iNt{; zoPub1CBJI%*&E6<5=*-D$K03Iu)CYLCj6s_Rh%r=F&7>U#mM(T2itt=M6-HODW@~{ zL5VHwjR5j|BZINz&HM%O+HluYMjmJS>jj$vfSgO$RK`%W7Ziw!`i!>az~sUrhDYZCAJ7`(t;_ zT2OVxMy%nOS|WdE(sF#RRc zZ(qOR8h1^4HikQA$ckXr)%5u#|9|Qf@;i30R2l61ElRHR%Oh|GcLYcH=OY#=_9(1sen}e%foP zLC*b{*C~B+XY~{#&R(<$tsWw&(+Tur#BZ5;y}eq}Q^sLBpWk_4vfROmv``a-c}12{ zoXpS91&mJfWREFK?J?H>6Eu{FNj@`60!#|}@%ZaHo@^PS!(Y6;oCT>`0oXl$7{tU9 zwuti|76od1$ii3Irw_}%4+YgAWwi#&S56ex5@&f@O*kD0zr*BS9hMd5f&}9`@+tQV zm{Y4QbM!3Mb5cx2;ewMKY0a?isM&}Dg+n8Y!c?2d+np9iZ~QMoE0kj*bm4aRa%jey zuYv2X>B^j${|0sH9F04xwd<*f^=7+qNcX*5+^_u??p+0a%I8e3izP{K7AH&Q3AK7( z&GpwKdxrMB>NuD5&@zf%IoSaT@zU7wa?I=d29d^e4PMJ4!mAAo{a87*+V(Z02mO`@ z2iwo}g zJvvqSEg>4%sRU2RSkM|9e*UQ@x3K=IzVj-0fa#p`cOiJo*)?^Z+RkQR?|4rS5z2fG zT#Stcb*;?Tsip&S5NmX~PVLWl?%q8o62EaQ8RC7eTz3cL zW(Wi2l+x1D30Sn2&YS5<);5={ok33IC&?20a)3(8qiZw|!wS^DWhtg^3(unG-1sx| z*jY0V%Eh$e7Vk($Up)2*&!sOwM()R*X8vQmKCENWIIl*Gb>UYn%W#q=ZW8$`YyvtcRjWBTVrGga znB0b|WRDC0t53np5p#F8DTG2n_KaXqQ%gC&iIk;oxihJ-F~tDsEUj>B^Av2H|6{@Q zEN*4#T8$*d^6g1%+#LO_?XX+hor2TVQ4kwXtmTCIO*e}LgxF|EewMbjHJSTnW;%QS z%iBG(8x9Djo_B{=ADoQu&Pp^B1&1l|?yW~53Z(hV|G1GhkqohQIr;dQs?Y&@VMyFB zMOvLA70YOruixf66`6G=XR+W8T;QqV_FVHveN#3D?-sao*J8UioJL0Juj{I#EL!!< zAdu&0+B)KFx+Y)i4y<|!0|zBSVEBGzc2`gp2Qd)W$`zSM!ngKX1FYUD@{YX+%L+fZ zrb8^6kOSJUh)sZg#39zzQ}jG+bbUEw!q11AhtX982UuoiPaI0hiDEk&lFfDIC!t%$ zSiMi0DJm08Rbua~D`{1oD%=+&ky+xk8i#(F<|nb<#FL)g7zYr=aTLZ`BhEX~##~=h zm+~IwG^AjJ=6}v#>j5a?{dsb$uP?WH5BpC8#2FDOVCWr@;}Q4F$GzFuD~h_ndR!n2 zg+^V&?A47ug1n?_V_!g`ne~lEqgwl!EZQLR>hF#OK1RFOfKYR&m~9V2ocu|;nHO5{ zVcCbIT?02~f$?y}J+V9VZXX1yA91S@eaJm)x%@h7uR~Y;U{S~=sn#kOL<;nAnv=1l zTu_j&5BT|z!>f-^t)z_3&3k1MqNBb6ajG)9x-C^xg;vcKrglFi&6R#ZJ-LpU_UGFR zV~Cl4XTntm_?>L^d_P`KUCTo+ifJs3@I>C8zO?Iq(KSNx0bR?Qvc~Nf^xKU2B!q2d z2Z11vsIvxK!vHM4l(cX;sIl5w8mq&JE%36j0Z+BXI@{MZ|KJ#ps9>|KStsG^s{C*PgZ z72aJ4OaZ^(+1ZXAHCx9^p?%Ra$)~dr`mzx0U1PtX>C_aITCnX(bka!~cS`gJQmNv+ zwtpmJlCK6GnYXp(8v6+?K$uYg=N!2(^?vldCIpM)Z!m?AT20E60FUTEci8au#=3*^ zQh3!T@XPf?r?Vn~YUI^NyP zagnxk@$$W1jm9ARMr)Nik*K@hKpfs*HXcj%$zbv*)e5?+O|?=~@vBR^r$v=_9!olm zC0`p7GTjP^iW4zm4VjYFa;~D|iBFwc`dJ=0+@|8p4nyKwkq`iG(q9@(;EI~k!=jIL z{!p9TUk-*eJip@IoW*>GX@j8<-R#QG&1P=ZDV<`qxla?&D~2KqTX&ZJ#^yP5Q4-o!TPU!+7T2DVOA?fmyTY>MWPYDhzyjqo5{btCwUw-zolEo%VU}o#7*KgbR5sXQ+~{mOP0?=|B&q_dsyd0 zq98tHlXy|mGndz_6>m*7C)+jIlr+vJX*|s#A>(PWt_mW`ent4Ve8Why4;zdCj=Vh>n4OAbt&(5pxcV zZ66>5Xr|m08lq5Hjs9fXIFA=Jq@&@fhqQ3f<~BKKyij;`x#Y~>NhIMCQ zQEgV}YDTrq?EArcecWjar>Em-{Xo`y%|Ukafi4{a9izQpjQO>T;rsmIgq@fNZrKa@ zzH?B}_xq+0>=3Hvb4R(xoaFOAvUpOpv||&lM$h~h8y7+z7u|wvT86x!+pjPTJuVaj zD>wA79hAni@oe)%vt*J z1S%CD#g!&`KR75o>fwI#+1K(XT%1sMYkZ6A^WMI$I$x^w;z~|~0}Lumt)VG1&hvFq z$tXcTzc$KDSG*fcM_qVP->p+0tz6ze2Kx4_1qRI#cDo>7cYuyB%*Jf}uK(xIwuxkm ztv7sC8TU{&0DSF_PuVkVG;AjX&80_?kWNpMJo#za>|Vg+na9QrUVA+qtijpA1k`-} zTL|&VU~Jh0ywuwt?OrqyL!lkYd=ng&=o%j*C)!a!w5`eJge`r9Ie9Fs>+Af4GfdE< zu$?AJ!{%AIw!Xo1>kiQ!FJu`VK=6ASIjMZ{t%3T$l5stl+rfm0X}VOb!wy z{eAaEVZlHVTe+{QNvP~+5Fj>t>(=rkU7oc1^?E!>9OvfxoNw;R*T!hVjaHcBh-hzO zns)%i zRh!PphQRgrm7m~EDm#SD?L=P_hgn8ySxu{oTSlJTH9?L(4(gs4(XYoD^4$+r7vLN0 zy*`kl^W&)hx6#cb0de z#L%bL+!%K>XNb1#Brsm0lC}(*#n2eeO{+WWi(F>IIZDz;lQ1deN-|6oX`wW76EJ-d z8kb=ycwRVp`#LR{lH?n0(|&dOMU@Q0U{v{PQ1tejz8vi4vrP4%O!?9>ck>aLBL$~f zLa?R9w<5QRzEy?X`F?+!?c`3hggURc7p~Hgp{w`D+HIe3BOul?e-3`_TC{I^Ung}U`moN;oWCUZv2GC6KZ6gp2*uIs?8;)8*F27cNeQ7P}NnP2%L+0=-*b;^t z{$j77l?99p`pxrVDOGd(M)c>zU4(S6h>wM&kNR4OdncjcO)^@7l3EO&$r90e%4tXA%D4>;6oGbB%Ww{uUK{tz~3L^l;oSz)>eFe$Uqjfa1RPkZcdXc+&;#FxXxt#%=I#Mrq3TO zKmSFplfI~=$$UtG?}?I*}<*f`SQnfqVO z>h)JtK^qL1D`%b)4G$@q z6XE(ng+Rv+NPP2Ou23RYsG`4}0+4GBOT=s)r4X~GUy+u!uEbS&g2zM7cQ<8tfv?=U zn<+HNAF)|uT{1ruqklzednr6HocrQ7A^%|6FjfM_WygC`npG=f#F?rIMh_^HmA2X$eC(B}#TaQKo*chz{n zrtU*GRyw>TaXHT})aflm9vORB60>XV37qrx`^HR3_*9 z*X}4%)#0*%#g&CC6sepGqW5+)X2KzSwHOVhaT{RQU$mhsyLkHP3-MzoAw4Gnb3+Ci zI^Gt}vUhgHJ@za%Ls0lsDzmUg*DSrJ*RdXVGydeO&?93Vy$4QdV^Z>~la2Kz;JM0vJZE>hUX@C`sLhDMWWay%jDe>V zl68!}JN%J>)yng?M8Znid)$dn)uf|%fkH3z&ynK_P6u>ByI~wu#TtJPWD@iy{@qk* zJ5WwDPXQDap4Ad)TFrQPG}9Y$@{BIyKLbeg9MG_>ElubDd|TmiU!#9D0ZKSYSXzoG zS-^PS*+KF zG_9zCZWkATfwRc^RVjPE=14K`GFHu{yy0WG$X0%ExYJjPc2e~f&Ygdnb`N+q90v$Z zaNg;J^KA{G4r+LFqlw)GrTi?p6dA_T5YH*Yp{r{5+wj0!>P`BEF*w)MVI4wTFw|G0 zF=xy0l`35FC(M~I$zJZ&u+}@&LBr-NHAgor4lH$z_~S^mYVR?I8>8Z8=N~DN`8YkF z_S7OtwpM5*H9*z#A6Z;C!o6l1#&hhf8)Hq^arnku0-_Q%3#7t8+lj)~V{5xrDtKBgEKJ_P-Vf4`fU zEbG{f30FfVF2jaKVmq{GzsG^go6HF3z5W*Y>bDA^1o7u+c4ZSi9?7uY=r_sy9i1Z;&^1T!q@7)lCp{2tjiH?dbTS8&5j;vbh17v1 zxF$BeOVe(oTvahiDqWB8fM3_%;r-OA3ICcy{i6T#guB(_hq?F(18~0|;!?3?RG1k7 zHf1VKNCfNW;!)XTx_QL(ayc8m?X60PgWingaJmmHYkIWCaK{Wg`Ogd*F!c5UkuqCP zwX2sZyvnMXS53;QJzp+U{aqy1^hIU2!N^Q(aRk-G^x79W$b_TUgF)aJQ@A*p?5l>c z+gawRWGh;gsWEf_25Y>P8;QRX2>eE;ee?$;JU#D0?i-I& zJq-UGa{IYg94}*Mp9iZvOvsZ^XRdty+eOP4wjJ>J!ER3>%qI?7Vl(X>J(D=;T4ot`k> z&z0&Tmed^XizY=kf)lf5%Li9gi>Ht<#)Diq6f5Ecv zQl=OJ=->F>ALKe^saMqkh;iaRw5yM_p5s`sG!9zyaLY_3s***RlA{uBMgEXZEJ2iy5Om|TDn33;&j}D>4-Xc(2Qm^w3(Ui zav%x8?RS{7?Adho16re7JWy4rK2ptpaII{i&<@493>TJ0X?ERkw?$A*7~16hPuwH+ zz=tp?o1Qo$}eyFsP8#z-@aZcZBormDWBaz zSbQ%*F-uWiX~RSF==-Re@vK^*>D+aM_6G4s8}%aL^|Zux;dO^!pubyJV;MNF_Ypgq zRlCIL}bPsZ0(M;*e1!_f;g_2{m>IjXLY^o^>1i@jdym z`if4?gui}8?J<9#(&ZTxv8U50RrdOq#5222a`b=EOSjry|}hesF4|p=_oY!67H_fwVkx3De>H>4C!9bhp;M6Q+OZ(B?F_`tA{&o;)L za`;UgyU@}c2APK!)@>*)G+HrC2%ICi5=2&Tw93w__erL>hbbkauUZwh7?wa{`WNxPWKqBEQZ5dW}Un6cx&Pw)-BRkdU#+;2hUE=Tz$5Wj9fImT$ zF6`E+;hqJ4z8_PA@$f)R;HUP5zXP@hikyC&+&k9BIM0$djud)+v^OXwC8F?-WJ*BE zOt_FN<)`n29u}#@b}J1A{QlR|+xyOlzr2f>|FfeXUHISgVWccVQwP0Ww=V&+c(Gr5 zYQB487k%E2uh`^(~A@RirA@kObrySVBz24thIQ;on{)>N{lu-^DmSxs77t8}j7wBWFY>W;9kMInvoA=jgAk*~2RK~#eAnWIr zxCnLx<^!RoDbdB|`rWP9-#jfd)W2lo`=vNL7@=1d)tTk_727~TwudbhLORzmq`jHccTgnHP;2yYz%tl3kwL#jK6^+RO#$?X5KMg38ww&B&36EJUHcCCob{@{1M zz@e2~SG8kXyj2v=6QP_)@}^hB!2$eI$gke>?B+$Bu{(yVe-IF6uk7 zd7p6np!%|BEjUv)cm~-iJAHRS;xl!RE7D57%vS{ZN2N>Z1SFWRP);^JZowB$*nO@G zeXw{}42n{C>fcS_eFB?a%rJDD50nT5kO7)7`~hMr^q)dIkuu>aaF*t zhmw+&W&^Jen2aSB{44x5ZSobTRc0oe|Kvilf*vG2;UxgHFI;=0NOqGe9$1Qt=Pwkw z1q@!Ytih~MWea+#7UnnQ^hCiX4KHjJ0M=gJn|GE7y6U9ILk^BY49A|QhZARk?RNaw($W5 z0To3t0EIJY_ zN_->40;`{D{`xJ&v8|LTrWcFQ#{Wl1G&(4r?e4FOQGvQZttfGwJT&n@#hhJp7qV!2 zA*?H3pd(Nn_)%DVu2RXCC+Ug0U+7}4xCz@WSR6u5{kc+{p%~xeNjMtpOj@aZAoB=Z zN9Blow}S$7Gi{qm6V}FfdoDlb;GOEroo2PnZ&9;iwp( zXd})a|ESgfZ1oQ&aj}^1Ddz!bEU7sMn|`q$*H$R$5m0+i#EaUvEE+)Z=>1fY=%_OM z9iT<`sZaRe>jAU;rje-p$z!Hy+8g1W#VIb-^Pq?C2V{Tn8``DTr_Eb*7K54k?WreU zfnBgwt?~Ob!UIM-WoRUsPx37LCs~N|kSlBg7^(-3E+iS3FIgL;Nt^Hq+Fty@4EF_P z{Nl>fp%^_M%t<5$!cC_d?|maDlKhC$uybWgsNJ@v*9<-kXdMN5fN^l zf34i-Q&7UxFkO^q4gY^!ePvLb&9*he;GW>Y2A80NOJHya?tugggS#iV6MXRC?i$?P z-JRebEI0)C$a~H`_uQ|#YO3a6KfAZC-Fx+7I(wN(2HXE?R3<*di?91CjF2Rnl)l4` z2F-rL9BLSaODez>P2!19LIHmrY8o_P47-JA2EL>}g}*Z8zhmg&Nmu`tp7{E5);>e) zgP@_y1JbmLaelD*WQ=angmWMUlwu#H1cZI>J2X6y;Iou3Fl$pQ+xLTIU#M3M#u2fJ zujy1lZNTse13Xwf{-05p7xE6@zdmqJ9A+Lf=uRe#e8}_&7nc@$9y1ubG3^zff)(xi zsiz5ShU`Cfiu{;`*@6!K3SdwK5?3bKkzN)rCcKKzn!b({+u8LUNiXNeaw03E01WZ8 zp@8ktAyUe^T`!aAb>Q4!KXAx1yfGl>mi}$*I&%Y#q7VAIBFy~iznTxLrGL-p0d8jY zfo`CZF~KK19&9?4!04Wc4ptwk9E6nn5Uyj~@{pp4Lx@F^dWt}tMOA1?vPsNjB#7Wp zumjkpsZGq-m@CJzMk&iWt8`P4oisA=)cRD|AiKH*l2>;QB$?32qC&?{#ideu2cC?;iyHTd{Mayf^7$WB?8_fC52uf)pu+QeYT0m z!btx0$ttw{y_a0na#(M!;@_7OCzA0e5*wwD)FCGC`xNr!bQ=ye%ils*)HO5mkQ@gl zj;(t5eo#Yw4z&@7$mg(X<>uAzm?o-W&hbX|(r;BW*{oHrHS;I_OBw!#a0)euiQTHO z%eYtbzuP2&%8(?o|3aYuruLrdFG2EQANjQYzwW%2``}Gf8~)!=77DN8AUhsaAR=DA zx0rK|>V_m7TG&!&nL%xv?Hekf)X(LkGJ}6`l}n-2u36LGR=5Af?VXDI)UdR3E?bUo z+>+M(yZl52{rOrh8TIi$M?$kX57V5tD!KZC7D`Uc7M9{Sa>E0s=0ZM5Rfj91ugF$f zy0!k-+&b{ha^XE0*!*(uW?WXQ$5N1*#?2}V%gcBU8cwL+6c#<4 ze5@9E6n0pc2hL#C>hItmLv*g^kg|NU)GQL3wEoI^p&xI84Tl0!73I1AauN`91`zdc ztO2e^@_YZ!A`N6OR3z6}fIy6~Q%K*Qh#kSeHil0MWXF;-$+O>QBwLK`!lO`^)$_q3 z((*m0?kUC>B(Am73`o8#rQ@wB?8np(Y8`CyTW{ zO4E(HM7+du+doy=zf-qN4zvM@M_}BB0337%8v5Iionf0ds9>)6<_4;3tQYiR!j7*# z0l{y!QK<`d7~@nMgB(%({8eC;Z)l2W{(EB1Bzj`jq`cWoWx5LiKHM3C zB!;AUUJ%o`#i4+Ok^s1>sqIi*TUYCOLG$Aw+H8fTF2T@lq`>lV` zBbve;-ONv$%ui!{Kf1 zW8{Ou_Fz^pBO*Hn9#|aA5c&w&mE1A@G=u3znu?BQ+%|@s#)f-KK45nROzQjzBL};J zRWpJe*S%mN>iYsEkql-)O|pWrOidZM)Tv7#yCMHPtO zCOAuqxE#8H9h**rHztyg(Y2+{MN0RdoRld1PI4?U!6BXyO3sBMq}5obsVn`!gUknV zOmHeTM1LPcBtUhd@xD~mL^a~(e|_tVU2EZe?;0F(8EhDUIsu%m(E>;2JGqBNnRi6; zeMb`IBdgROA$?~Sw{IDCedT8)_E8JE#lFLZB8&jy*#Ny4nU<-=5jt7FhZ-V$*JerG zWAjE2aaVlq_x_EU~MeUx6ErK-{Kez(^xHiJ9(m>W5)K!becGE-XX5-nW9X_h0eirOb$c z2U9%zYJfQTFrWrdo+tQc#3b>gBp}3O+j9XfJysfGJrG0jD<8?a)JMw1Dr_F z`IdWNJq@j?u3V7Jg(q%QO;-&vk2BP!3lG-B#9YnUWPurmjU-<)78_Vtlr7Z^avcdv z@DF^#4t(Kw@j^#CD0)oFFg%T4DvxPkdXV0W$h)Yf0SH`1*|j4OM7Z|37=HfxqBa zql5B!yz1-vtejXl61yotgkq@xA!GdY98R?k8d!b|I`M!-yJOG!f_)1*@-pk%vB9w7k8U1l zZhlK{#29{^XD9;;#bjiZcAVeP{!4Q!htU|&87`_`L1mx`!sUwzDsiG}n({xljA5dx z1I$AU%s}H3FU&(U&B8yDXNbzzNBG~-z?v!p3xy}#m2c=et(2249jx-@6P9udO}AkN767hQZgTI zNmpLFt;lvl`#Ru?sZUoyuY3NT$z;Bi&-y>RGfhX$@3W@~6Wao^^hbb+B+df$ax0$K4GF7-7qC2AP%h9~M z>@B&T$MT#kwDAm?izIcq^nHXJ-K(Y{UvwI+sX+Q9P4YwrFvj2ly=?RXCo?_o7bnI` z#YDpHA1>fV0#YdNwL_ntR)*VC9yjTd z{S6MjtHpz9`sX9*~Iww zp+nP;A{WD=B93UYIgj_+3EE-unHaeYLEJcjPkJRSOXWNVdpg!y+K-RZcZ}0LRW3Eg z!9zunO=4F?$CItaqf?oJ+y3Q@?-G1ZM32i}l0I+3yx>SVwZO62Q^el)6F+1qj;HN) z#pkE)z-dht_}nwB<2L`KYRmZh!6#o?Tu2>k5gr%B)>?|z#pkMPz!bG zJRhVY>;2!ZrzKb2&$o=^xBbGqr@AG&H2%#$LD*%wp#-Xq*VC^N_I6pW>GCR&R1o`8Qv0RqZW=lo*47UI7u-|5Ok%w$_VL0p z-o3nFQ>*3;94Ypa-v8+o)ueT7S+2Y~xn|8$AF{6>yi9sV_V2X*BV#68uK)T=nmO}A z$|(EXB#g=GD{ctK95f)LF>58#2Oj!VnSAe;GN7srh!2T8&_CA?^!AZYrW#^0)14Q7 z6&Eq>tOqb&yF`ChR~C%)^#b|3pqRCf6g_dA@%#~ial{q2%9G2mZ5jt302P%qATHzorN;Og2CHX;LC|utqB-a<+2fbjcZLKhXh?Lvuz~ z;~~+h>EM2?&~8b!yVzuSv7;r)5El#x9e4yD>gZR`xVRNQDRqLr zBZDJV26`l&FO76}W^`MKE=MNQK)5`Zc;ce->FBtIOcF>=fFrQ2sb5ox@j`Z!w!&<4 zP~M4>3KG~ev`~SG?Pbj1ELs^sU{56TVg8f%4uyKwR?pZ{&#@ysIp( zRJ29;=DL{8sP@tjvpo1BiC-|9wBjXNVA zs)9NdjR)fR1(BbSv3&9}%Qcen_e6;~lJXg#Jx~~04jH!`aTSSy%95AyVZazaS{rcQ zzsfB-dg@+~od_%NXJ!>R51eQb-1Ob}9@^97+mtZNTHA`3t*p!DFAo)AfJ?*e-6-7` zc3!)0Qw};OnmCQ*&B6$U1Zni=hE@4UR>JdiJe<85z;OHLtJERhjqk4E5l_54&k9&D z+Q_lRs_;7@Z9JcgDzF~i(+nnqMeff&K23lKMA#>JTAmX^JoOsx)zGuO&$S3IMP8Z) znZk&1(eCIov)TxrSrjiomMvJ&XdUnZG$|voAPYd^6s9?nI-R!iJTp2dM4boKJ&E;@ zbOq6f8`^y_Qp@S93+hr4hQmMIWnvUAE#c!u zpKEwlL*`@nNl_m<&Gxau6BJ#J?BwcE<^QlSmdU)7+hzOR3yb+H+=d@S(BHPd2{`Ah z^wh2UsAO=?jv-9e(}me+c-?e9e(iP|sz!J~*!(w`Tj~4ybb}Q+4PIUP1J}R6WJ58M znv4p>@OEC9Ij?aBl#9p%<)fcC5^N%&1o4gT?LoL7yZ}q$PU%AoTh~nTK;v!bLL~6< zQA=>lk4jlE``-AnN9>!J^9zYpFWt8xOLyYJ2W=CTd0jYUu@~Odq%$NBj7LitYq0MU zi+Ir^xbX;LGWRzy>qP%;+f4@l;8bY**HHQn-!8UDl#QV=;u}0sBEfeA=*viVjoxoW z%(rp1UI4eCO3|UOS)LyN&b3TiE_?%AMQ>f;SAb+2^k>#YD0i8q-(SF3rcx+)8{AsGpzx_r9sqN1jb12SZPNn)ECD z3t2VQ=J~>QWHZBaM&{6!F~I(0FWjhwE)3N5BBU6EKJtq+%1FOK%8#L123WbKC$Fuv ze8l7)BbA$x#Gz2*_iVs}bFDA0cm1pU9!0Y(%Yyewk1zi2<{vy%^S3Bh6)|A78If4K zbJmbZkdV62`^TwzfGmk<#)M>&;le>V>LYoBhkSI~!e3O};3FcmR4-8P4FC3(2MJyG zIVdM5e7U-k6dHpE_8%GuS)x?C?oCdMrrfT8GV%Q0+d4BQie6G%4Q%$kYWMN-9>y8k z)`hQLXHXV&@-#kE4<6aQcwsa4W>Q0SG-MdqX7MEv-IF{va4umrvMxE%(4iFY0Vh>- z%EKskZ&aA3`QmrjVWOHOKaq9WR?VvZWgDV^N6G62e>?`}ngxE|>z`~1X^!Yd0qujf z#{$CL9iK&mjC-nBsMC$?6PB?28UnMPvf7;y2%JpM22rF)T!nV3>TE@B&YG&qp=i)AQzG#29CDsyl>Z^bpIINF4Z4q#=yD?(ZLgD zjGDS^QYk~_fk*ZU0g}Mw>X`^yuV!T;JAUO4Q~kUy@b5X%NEKq>gYo9xD03Vm!yrRxy0BjrR$zZpXqVAu z{-A9<(TZ*t*Yp2g5exmT;YcG@VG54;gJfhOrkctVCr=N#i#kc)At!H5UGi zesR!7F`Liv4ecU*ba#wmD3s1MGil|?t@vmm%oz7>hG&XP_}>K}8;h+Z)-{VkT{v$t+_Bu`|GPg!pu-csO(g_d(cYlbu4X zV%m{oDK&eYqNzR(#TBFl3%TfG$rAAPmpbwieBMW0GCN4Pk@yeW7sv^nG9Ps&PpFu5XOU2t?tG zg3|e%NPdF}gVR}KkNoQ0S^*TjG|P-{H`I05pRnFXq(}*miWyt$6+?<#?uy39K<&jU z*}W16Se&B@j>?)X@ukWLWagigkm1mXu6vx0$V&P4*Vq&|FL44{xZ4=e%0xpV9{1*ZD-%;kDha}ba zV$5x0gB{2S3VpbB^nZ$dEEbfR^@n5Qq9QgGB5@WLdFP*>zW@?-nm##vo+?j%Rt-y0 z@NPPi3q4Re_Put0^*#AGu*o$*0C)ID9{_;VzeJ3?h5ygj^C6KMkl>2u!~ro781>rI z@OF;u&iE?azrWVTqt^v{@+-&)MExweoY1e+ntq74hG86X*`~(k=k=+yE-TfR!_9QR zPQp(roxt4_V2Ly1R534EhKs-oi=d+$&%|>FXw(u$vvovzr{!7}2+CviR~>B%dt9B4 zT0KykSvmSxBL)Ho7lea9U-|+6E{;7P7)D=e-j5@@yS~Btqo&_LgT~Y|J%y@>v7u+m zQSzIwZs=morq^?7%_3&?Hc0EuG$Ki?>EFX^dIa9Jk=1SR4VyxHr&r{WXL_S=+h++c zS?f{^=ldI7u);|HJlD(e%(F1r5Zod-wABlnakd%^%s$NXy#b{*y z>S6Tm8P0=#+mH2^Na7*K1>&Q;V{US~7gwL!%$t`>!3fFJI-c7EuM6^bi}Gf~p>o@8 zGw$jHNYK3yL0?FGKn0G6RD3YyR9ZyU zPWQsa5-O{3`EwIQ@-B?qt`1O(IC!1;H5M@IUB0V<^zD0lP7T*Dl#fS;a~~KHD@ik8 zvh;f^kl;5zA-72;U#Q$MZH>BrNaQpRN(}~9Op2hfarli$xq!S-u~7cA!ey}rj2vd@ z&oZBDir@}*wwKv^Q9uJ~bt!5FYxQ`;@@{v^)bO%$T$G)D>r<vLFUje*`fMe`MRiy_}nLi0m_PrKWh~@VeZK3>i#KF_dAOBlzynvv>WC4xm%O5UY zYTr$HQT8uiMZuo-Qg24(0~6V;kl!hjwR<&$Jbh62&76L->h+#yhxS8sbgp#&?LpVm zCILn5{RkI}C-EU~O!4(MCSW^03Le`OUejKItxMj-;cC(X)juZs*Gyjw)r1c;)04BV z&VeJ(lj60=_^L(%=qDtPMH~A$LzJTXXOuO<4X>M-s$Ybc^PGgZtW|=s4A38!$@XUQ z`I>j4F4@IMzqeU>f9#I`k|mDbRef>{iPuj-`Y?1A5brYca4?d}hy%A2?xM0_^cnIk zE!OKEiFU>P)g$+NvLCW9?(u(?LAc$EdTx1SldlRePHx4VO7Uz|bPPnPNlMa6Rw<|A z7wtglFM#ktc!KUmOOIWrLG-GKAcb#btSLSSKe0{jF=A|skJEmAbVq!Wa zU1-F~I0LZV#D*in=4yTwi}STeSxJhn2u~VNd&eZ;{;QV#;I+ae_x<_!9PH+Ktib!a zn3CszH3bDL92HAKg(xz_J_E;^%VzIscbH$z=ywz#!kMKAYGr z%9!K2CuLv#3cKmWygVyDk^a?=w9ZA5M=irOeNSD+#k(3}Y<-nHO!#8rHB%hw{?e$(iXK|_col5%8)@BOO6=pvF^t(F z$l8#U#t%`Jr-?x%ed!(k%r0Y;87GXQQZ1GFZr@agbP<5^ObfRGX`nm&A1##F@ZoYD zj1SR^DTviq@KsUGouPj3-^N3EuahFlOUAHNSzKHl$z^}?0*TN#*X6$t@vJ2oaH-a= z`2FCikrY~Qv)bhBt6goP&0sw>m`rDkk?X1N43)I~QL}Juy(|?W@wVHs=Xw_UVHuH# zl;8pB=WSMmn(YMqeOVLDXgB_9!MvUKyDDg9=^aaQiaU5z%?m0KnVrBB(^eqGojA)Sy}!8SYh3$CiGrDBe#iA^hb#d!c;2Wlez_ zHzZr6#!^{srTnhy{S6$>6t;feo_B5dA=0dGA@hG6R3$WI6LbGUq3Y?FufRG+R@5z! zlBn(u9`O4P-b)|ijUw+EM~vQKlAtQjX{_MYallTW1icl<%Ce0b4{n>)C0Ym@g?hiz z<&_&79IR}6R%oGxS#wMO*xCe;2I5>NeiBxTpFi}5c71+6tcsX%ilgiP=_%j2zCsC?nPjPO>0>lx0MdPLOP$K{QnEzMI|QOlUqW{;X4G!-$%m20Dy@roz>4d*bmt1QnH&U@RpT79VW^y+k{v z*mszJ`pm>yW@c+hVrBP((8krO8~ zoSpX92pVWXjdTPA<60+|&=h5%nV)bf6IZR3%FL27=xz!ra?@Be9ovEPU=hyvX;xd< z%hT?{cigLRykdw@5Ve7goOtX#PYIG1~9f z75Opwu0fpgIV?erSYxre^{RRsI)&lm_&#=+|X^wqGT<%LW3qQNRI>4Yj9}DyH#81z@aPxL3 z6gH0LP9ETXJSc9&%u?{zIVld!nUX4*+Xh=!jeRATO8<<8G%V~bTDOZe!m`>(o?5#r z+Q*A&=k8Z7$Jj(g3qQqAIqV0+cHFw9*F}iyKhj<9x+y={|<$u5&?HW^Fi;$6uc0<_?KzDI-~5T6 zvkVuw1Cgz0Kk5(3@#$H0m};z@3(v3v`K)?xUMUl zD*b(xfG?v`eIg%WVC(t&Pr={xXoVaXj~_rqabkcNoUpUrt_$;ZJ;v5u*8hsU7%9M) zs&1DnK&ktrxEZ*bqf?Of)ug4r0{%xIo{lpG6k+}|&*s#4s)+1Wk*WBidtm7iJ@C&q ze0GwcC+UYyOZgn$5t650;li)JVGkpa@&Zb>>>CDpPka4Io{_TXqZyN-=7+HYpT<75KdA4*(oahXiH&>io)|Dv0?I= z7Y6={WS{$^8c)$4uI}Fln7l1tp(T0tHjhT^<-a_1Usv_oG!>rPTU8J zSV!p{>fDDn9R^CrCR$f2&98CU8y=Er6$`DrndPPm*r(NHo~8N&48u^aE=Vy+g$8m%yR_JP5B^9!xqWFtV0{P&cyxIDUnQV*JWi2jt{Ip zaNzzDJz7j06Qu%C!uX|{l%88PP za;|Y&;pJCkW@q>mv>eac+7T$1f77mRPjNYaE2o}}a%8USL%`@8zLwX$O2ce5`fW!f z*oCWzB&Achuwu?P_Du%ayPayDRnERT>$1%>*T>+S^zBd zB6R(9ILIt%T~hx3*mWDYGFU*|i(X_5Y{POfF7qhy@KHe4h@kbWf+n$~)SO0e;b35f z8)2W6{^8Z&CY(%)J;_F=PZyJ;r+KMq6NlDWR=&y8SPS!g@COiA5^o#K@}o${0%z@F zEk*F-MWm45=;ho;z7u5)6d-S;RlmJtX%AUCb@L@}eMYk&X%r7hM?~%uMn*GqsG8vD zx2bR1geK1Zl)qmzS>(c=+~7PbRfuCzEvC}mw2z|Ss%Ar6VkE;}Ln2b){Vx9=_cbB+ z0C@HRYMvoqL}Bg8jqsM{5G&!$||4(ZO=*w6)}3Mbi*_ zA(egW*#K&WP?S@tP0><_WpOz`u~&jaVC|J6dp@}DB`8jRtcC9NouM*MSkNAuRA@IT z-yE#LAEt-vl^L{=z0i$Naqy3Uq=v}*ZHW56`b_AeIQ~v&W@P(LmQVPl)PLU;qT&Bq zbl9r56t7F$WYOnMZ>4HjeH_+oMLvxsIqgE`nb_WLFLtfs%=#Jw^Bl+e4Ky$nk#$H{NdMA6;s4)##%(s=pyyan)OKCiBY1g(? z8}?wSMst;x%BLVHeVv0xN`!-K_xJ!<`pKQNOrZiSVl3XZOu(-u4k2j^o^TP5{N359 z#BAc2HV9n`81O;H!K003SodwZC2SD!HxxqR>e|w0qyv@VkTSfrxfpxPqbAum9p8rwwG36ks}NYVbP6d!x!pjCcZDvmQOMv6^q z;$wGLf{3c>=Y>i>Hcx>KGSmFU#eJ++!*JRRbdqekFEiY% zOiwZG>Wit@CxQ&hJ#CYSdO88ifZh1QNc{1<5s-yNNhi={pZMOrv&rFN?PjtpNYQvE z`;wpPyI0VOxHZU2>b2iDDk4Ws4V-cY$ezDvU2E!dy1%&JK|Jj}7FZB^=6Iu1bGH#L zSA$PVWQYalx=$y0ZKYcs**#u6DsY_Ko^*WJLe%OSZs)4k`^PI=*1W{>Kt{oNNqo(a zTBv%#nF5#ndnG$Bqi{F>k<1uk@Y12?{P-tXceq2o@PX%!SB)ph#>A|@N7T8#f;%=4 zLbfr!x8yNZ5nwAPe*3`5BN1P>(P=7966Ah6J^=%OKp=6+r-Ar^FokcMh0QqbRsQOY z#H>9EX37O64oOr8$bxYVk7`g9ZCz;R0q;T6#0hpL)iG7+y96a3=yqsL;5@SLtFezI|P2VCgEMuZviI7^+m0N z$wY+ms;?St2gErUo0`o=hZ6jz*#N8^y2d^US;o^k;U*plalLxQ(GPbP+u`wR^_&SW(&*_TRT74@s7A|b9%ZWlat;HyDv06D_AO4jV&N^PDv7931a<+Nj^HVC;;a} zvKMoAQ}!9ATO}+!PLQLCJGc*f^1a>q2L}UdN{r>Vd-8QULi0s5`k{F8^x`F*OEE@# z7~-oAMY8j3RAC2qv5HAo%MtBGi`9L)Ybqc3Dosx~NK5%<7`EUpox6vQm*<^AL$6c3 z&yLo*)DoeI%W^E%tc6fyY;A!Ro1QU^ye|bn_=5EhYbz~__j~=%N6OKP<*Pec37Uj{ zipaEQo)Pp*F7?RvrL?-DXBH1tVTm+T-=aQ=1|$%p?*@A96MlDl`_3Gg1TM# z_MQ|WzJ;Lih_!=e%QKn4?DxIi$FoB^EN{+FG31{Fk2yoN+p)AEeWSfw_s*|^)pNcvFo$z=5A?!g z7X^nb(1~B7XQT*cSF^E7<+fd9T3DKmcACe!0^T>`C$qntJu1&<`-IPRaPt7HvECzZ zdT2u~>gH~dapWve%nuv?D4)oz8y-$~uKsaNhS&3mytsryPhi8I_~3HZvLd^hV6=b+ zYDf&w2@tM_D=AuWmG1z#)?8ghK9hDB2t1$An0;AHP`W8O z(^$GM!M~4PH9F^2H7XRQP0A_IGr!IuQAT@T%?Y}Lm(7>>ZHgd2#~4$b;ivpIEYm<3 z|8be}b1fA~2&0FCo`PlJzS+ZYqpi)O{d{Lo!|#FoL1Hh}IpC0@D53vzD$%Arrjf?N z-RMX|D8b&d!ME1S)sYC!^ZPbiG71QTie-mVeaGtasJ=eWZ`sC&-7eHt>6hMzgIm3D zGTEN0T08QOKdxu&e^O+EOOSo z-CdqS-C$NhhrV7FFFjV{Tuwg&{BoO1&&&pdgYBgVYw^d}=mfDOV)MA0=gE@G3ooVeP0E#sw9a-Yt#*4qvm1pT;mzHGrt zuUCY9nWJx}aOAcv!!F#)Vy43!xB9#LPsPlHzUlg^H!|Xi#M1PJ;!)kQve$RFO_a)- zaHf9w^ZGS#)6&;6;FHoqW#vWtq`+lA_Tc))b=`NO-aD=X5Rk!EySa>Cg_yQEaJnEsO zSkw4vtbOCo9zXq~lvT$hFTT)^kTJT^)Y68Lx7Z^5=k<5+IFW7BPJU4god=m}O3B0* z+MB@e*IQ{^&)bU}r^{C0$<(Cj&p%IPT!}c@KkWS`53;nSg7 z_#-6>eMEBU6lsA6^AO!{uj>>no1aNn4yinKZ7iTiJ8D$ZcPO%S)641wbxTLBg1`MV zHVee-mGZ(D=8(>MX|s)vw)yVv{G75KH7F$72OQt2932;XA^H3UgWpCLK5W79iEtmG zHhlfKpEFdDJ%_r6VhZ|B+#Ab_1I!?eVC}q83wS~#!Z5A+AVSGk2~WpzAZN0ZB9Lne zfL9_%kL_|ip$X@FmTA5iQBWFhd>T1&orw&z599a?+F?WjUwv-r7aWu$B#b+Ke{=%O|5P1pMbkoOKLGp;t(>X${xtd$JTfM{ zz<`7$FI}M>xDs1_%Y^;{l@vip#PPReERh+4Qg;s~1bP{VC;`9EfTp3 zA`C^1B^B@c4V#H=Y8GWL4mQob1Im7qsQ{L4a|5~FUc5<;a}aH(7MeLD@U+`jn%OPO zrCAQ}I%@OWr$@Ok%U|3Qmd28k%5Y{&J7=#<3UQhJQ!u}P(~}Z&9D6Wb{Upm6DeHO7 zu|P)hBx!|lm)2Q_dxhKs@aV@_Gq;3DzmBKktGxCtDgq?#)PIQ>C5@%zb~dwznn(Y7 ze@jN^^08;T2fNeP(9Q<{`V6m@BF&BFFWizj5Kwr~u)EL^bp}r*l8s7T&fZlxxLpI9 zY}NH0W{`LdqpDoenmFUb;bb2u_$A5WBTq4?>(Xfm#`z?4Zqoyw z>WAKTD$aqkVs|TSA;$BHvuni6jom|4-w~tGM#uBa#^K?}++=rFMx#GD^JmZNE;$qC z;P)>4`j|x!E17U8a;(uZ?e3!aM6;cshmo9beURaCu=c7BNDMKu=Br$8 zqRm4>&dwoi(Ub7A=Uf*EeWL1tIp6R=eD7`w-+sZy^Nz!asRf$(A^UQ*x2Eu z;Dj>_t{{);a6E8Ah*fl!@3x+-=Xr)a9@P|W&(CZ!(kHe96zPDD@=!=a*0$F+?awGH z8j zyZ)zu8Jov|5yu&M$E|M1{7$D`CWXYd;KYx)EZjcpxsq#nBg9%=l4J6iy|&ZQ+5LmF zU-lcqMatIUjf8d^xZaQOM-;n0M;&6dggPm8M#*{2Za$JlDa~fse!0y}^Ib|i8e_?Q zY8Q$cmhTaj7DWEgH9v8ZldK6R&>XV4$%6Eq^QY50h{5(JKVpUvx?W}a2M~wQhodZe zRFfeD22z$vYKIY{EiL)ZOr@#!?~1(!Xb!eOn+oKZ%yuOfB%d`;ZjSO-f4qqbzLX}5 zc{2Cl612POMZn|$krIjok7YQB;PbYK7HoSYZIVTU7kTFBVD zN{|ICFz~VW@m0F_GRvu@HDTD}wgsi+C3b5+5wB%m7A3}fHcT-LQT;te>8ggR;WQI{ z_^z&DH9b!H&eS8AIntgeRQ~*+S~lG%-=`wt4R%HMt=~9)!ko|MS;Ql9wdYcxz;Q`e zzORT=`0nO7eLOIT3+M2szyhG@hf`ll*5S?ol|YS7>K7F%!e8(j_!d;3G?){2!@@+V z_Lih1jRs2wp3!BgNWtb zgA7&*`EfCA>hpS!iheYW{y3-U3wUQ4Ivh=U2l!MU+`T8V;#{{itRNIYu)8W7Qu%Ns z$30?UfaGTxb{hDl^-cD*=I<^_32BM+PT}~+;xHGj7aAq3M;O*j>(Um@$mJk4c&nmdXK?9|Su|J!Ni^PONpx_J1Y6E= z$MIh{pGajv=@0AdoI)eM$joR;P1KOwORZj06V=_d~bpX_9p>=m4m~WTsm6*yt%xi^2w1yP2^&O7)R%o zqTr?9K7TG;?$;Molfx&oe=VSbUc}}*(x*QIwNur<;k+NX2{r1h^5(Hu7TG{GOsGM7 zoPtq3F>nZB#v+~+8Qy~A&GAxH$BN9sZ|`4|@-ZRLv5C-<*_NQc;*JM4yNHc4t5@riHcpO=xExc8oYu6cdC>5XL@mxs^Bd z3(buJ+jb_SbnXX||I9Wf>5L3h;Ou#aGa2)g@yzMXm9`VU%g`rV9E94U{)*yeOWpKP zQ7#g@SzA_N)gq=L2Mo$& zKv2|;6yy`XH}_W?u3zHF*>}5Tz+X}d{PjH7sX~*suNi{zn-P(v;((Tk8R_UGh2xNS zLKHr1-)`+BdS6Rxa|&C_EQe^M@k69P?t{M;xnoaAvlc*nRl&`)sYjdZi zy1EoV!Buj$(wOl-0;){ti`v$ySD{=y$D3PGFS5Pd3v%S$a@)OZR#ke(=E zew@3adDB|o(~0GG_&+6{H#9>maGB=-o*WisquY#bQHLekK7?tPkuGR6n$l~F{c~__}|?{}`Wy~|kDfYNf=y-SW%N?Q|{=BWTgu=oj3u|X{*;z81| z&XsNHUyu9C7UWU7bWPUt1BIT3jc2CoahBrcBGj-7Dn6GvoO|-@>v`$w-?O$c;4Jc*~`=PDoseaw5Uzl@kGzA|mW-qHbkS>I%NLC-q zO&R?Drzb3Vh{yHowab;@0KU6}u+O@79QPv=TpOAC?%aIP>OJYi=$7FjPwXwU2QsGQD++S8=J0URgpp zFvP6QXo`bBXq1tDOHyo9hwG#xj}nM<0GjDPCdX_yOd)cNo)7tIVl`8E%<(cb_l&I6tdF0$ElpcED&`SNLczY~tn53wyy0hY_ zJq~(Y`$3-x?K1}5V!xW`3p)ibn_y@|>(%YydGEdQmtWoD=!^#h;q7ViXH?_>KX#Z4 zCk~gkS*tQ;6kM=mVt)iMMT@!SZLtTVP0r<+D1(V$9>FIJgT&d|#;h;gwQ=ppc_^E> zPS(9)Dm<~6nPmp&x^Y}yl)bb{`F|wWa&lKVal%I5Xgb=JTyM+9z1s_m6Wo)7DkVvn z$0n+FYKu@}(c&upS+FU4LRohN{@9)ZEeL>NBm0zOJwjQiiL9bCsi+?*(g;6RRGo>2 zTyYEoko+T#-z;w2St7*raZdxJad>CCFc6Zg@|p)4-GSOVma_H>va+(2gP}Lr;wVy# zu-hN+GBIARk~(58hPgsQ8`9)QYx`QeZ=$fB7mEUBdw;2rLQa2qz-Q%V0_;G$F`Zqj z+wPyUbhc(|sO?V2`eo75PQPsokQ%&Eq2WgQ0$3Par>QFDOF$6xd(_MB>vE>1KtCEA zPiUs3Tq*ATm?5=(>?EX|MHPzQ$u}1#7CSZ8ub?hRF<a<*sT6YB#{qvLE_shPYvl+9&$6i}LSV zPWJKjEf}ru74kf6E$noLd~Ia6L47E-3L}!PI_n#zi;-L^T)aI~GWO%cDuTP@M-LwD zRAQud{#=F6Cqi&7#&+ai1vW{~ZkLX(-*8}CpY!vv{vuQ0@tNiFM5e5cjt&k!zU8lDPsBGBlmJ#cJ39?sUAZ>*)BJ$}Dd&$_Qt#>|N<}yTE3%p~ zK%%hzd;h<6()50FM$a&FXCu^`6DN+1t>^z4?#i7mOzF5r`-@kv;hni%+wzWXoI_KT*$SsY;$3Kf>YfOU@zvEDn zj@?#w>408EB)8+gVoUkitA=$Z-o_t-x9dl`W!eFC>1B~qNjihJ^u&RY%*S6$6GhgH;FRIL1F(<>uFf5o?_t>#r* zR7r&MJ-EsDBZQjGq@>vZW4%jp6pWUHrl!F z4kfU#rKP4y*IP~&OGe>M>sV$<5)u-^Zz8+>z4a>V=-2>!b@+V=@B4B&_{Hdg(eM%3 z_fX!DLv-c&ywl<4y&HjiYO6Plo&=cfIwR}4_rr1q4qsn%XD|+-G(@RAi2$~-v2kXj z-TQEy_fKJ*@KY&1f#Ba{_2@gniI*22zB!%YDU`` z92i^#)~*&l##-Gh2;hHjLs^`Ww<<0RXUO{#6XhVh>3L6h>e46ur#pa+-~NL}^B-6Y z4J(_+0;$}?v(=*m-%l0Ymq2X0ox|NqR*L$e)7@IBug&?~gmXN>LDmxBFAp-0@^S&$ zEv7#JL12^IQb7y80BTli;dV?m)d2=t+0ONJ^y`#9#-8!)%7H#JScMIn6DeSlE zW`VBp5%vCDBnI-*jly#FOIOC=pT2bdKBNsAP4Ajlzew28GSb=r>s>IM!chY`Pq-`h z3qp=WhnodN>-9HrV)?i;eJA{jM5_e3#bTOkFu?8pik#5>QyL9j2Mrv5;Y*UQZWS7< zJ>5mzaF{lvP6^yaKPZd?Z1W_^7R;BdgbB&mG%sbh~0x!@W|^42{oR?7!184#P%;d-Mf8$6zS)azE3XdIMMy$1s;sj)O)`<3DFPx^*FY~FAibqB= z%)q}UMHCZ^MqqinG>j=OHdOMqF$};wyD-4;`5LudIM-Y@BwB|5JQM z8P!F6;~6HXwGi}Q_%!%akr`KT7$;GmO`ezbx++Fdut2(uU0EBqH-A?R#015(9z$g$ zjP`jvjzi_QJaUE;MK7)D+m4|he%4FP4>As~>tk69R~G$Q4>vu}ZIy5!xJ1J(js1a@ z*VEX)pIC8d6r2=E+?8-_b7To*8~xLOq~j8EuE%qP4kcYFI$!WN0Aa!W8wrk@zr_)4 z=0^;U;=Eo<02>;R6k>8XF#1pdVe#%b_+!v{dm*W9!FC_>BfI>f88<(oG;sJOPE35Z z<&7fss7YMgkVDRtgGQ=k2<5`;d(~4No04_;Ehb_zzJxJCllK`7RNz&MTA0X$`LZwa zZdGdNX{xKM`}q>IMC}NW z?RP{~I`sqb7W$g;f~jk?l&D^Y0oQ;?F|yRdMPj1;CY@772+dNVt(9OrDRsjKWJ5 zG~^fI6%uaG`c-kbq~vYCdUV=!-mgnU95T;PhF0#Kwv=}7#UG6HFfaFBDbYh5j!a3N zl0g&~Wp>)`72mOJTjq`=IUa>|QC;ijlK~!O)6(CS(SFH(YQJC)Iqz!z=;&}hW#$Dk z{m}j)z=-c#-&4du;3tiy^sAKA9jZGh2)gy8ZuDSI zU75QJZxxe6=K1;0yM1Zg{pqUor0}!tqMsIh=fidsyo#CCpS2d325b! zeSKJ;^IB;fH55?S-o75sR5#~%f3_aF>)aoSJK*Hd@;3$1&D~It0FzByTV~~4+0ITq zvsg{xiYnKDF-LVY*e5d+AQlaTefbJ8|K3_mdna2qnc>@V@IX`lEcF%!C>z^rc`NJ4Ro@lA}S%OUE5>=Un-o?w8AEOiE_+YO*qyemd zizDyBM)AD0u8wQ^fD!J}ftn4FY&w^c)_11|>Mo;j`kWi;GdQ?&pAPEgi`7vNaChUR zvm-ur!<_os?~q-X_=+%`IBKv}{a#WlCHRHB8hkIy*(mEVxC1sn^Wn((8LUf%LM2Gl zpGWI0k3EcVud;bT<~%7(iXird1RUWc{?JaaM)b-GL#s7j_hloQUi~25raF(+|8X>Q zH%{~C2|-U|5b&(J^@yPtDp<3wvhnW|Q-f*kP;Nr^pY?Bl6y;M{xHbBKXgQvHgc2d6 zxiQ_V-#;73HvREyqiEQ9`_X)w$?sCy+`OcMpPHPE0q&if(~yuH2gTW8VPj(-4iGy~ zHA?JuH2ahNd3n5!X^j)QOM^lr%ynL`sOeaVca+NUykF=@(D{}{QT0eA|0Qzyg=Y>d z#?7qcoLl`YU-zwqFT_@1oa~bjlI5J!-D5ng(pe&t+|-WVzH|d&?*(dpfcY~?q`>1I#d_)cnj+6F@fk^K8$ravH}FY%8}^c zGgBK%p;bK^F;;n*qMlY;fw*boPLfIzP0wb1>V3u@Ourw;QdgDHH7EzA&EpKZ=yqVO5`*hL85dQGGvVEHay zC@PgnM;x10iHk%qC|8q1FkD&q(G2FdlgLSY&%_7F3>~P945(;!JgsLAkU1{*JvkA% zH>RP-RtT5f3YVOW3?%)vF=czqhe5O;dv*>Gp<}R@ZAfc+*7(kxhYI@-{SC#!z!%#=S9zgmMS37l-5^ z4#u!=VpMerK+CTyshP_8vmKw{7sXfCaP7nesG7}eGvzVxtjyH!^!qZz(;5B7GRuau zKLC@Ht&DF^r(D-{(ioXftH~}`sdV?r#9v1ey{+#4#;H1^ZDYB^H=o%rwGV8W5}|j_ zwnNz6_aN5LD2t_qmE}-`k{O)IgVhhK% z$Sky%0lv&F`-!&LmNjOzBNJ+RXfN~E!0V8D1+lG7Er6Vw6TbrrTZItIEj%fCcy>7R zyS!o-QbitvFQyWa0ESi((j_vpx@BU2i0Hh~HU?*{Dblz5>1Q&!3VXs|>_2H)!5k^g zw^S+HzPA;I+`of#5(fb>)Se`JA-&VJ^@vS>r`RY=tSG}0x8gY!fUwIpe7f(IN*xCu z`mhHQ11Y`HT@KP#R&*tV#s)0~#8MFNsNh3@pIRJC3E##6snpppdAVmMAnq`gl8ti* zw}Tn`u;pYVrKE4~WY+%2ZZeN4i6l7yJMgfKNC^*jyyYN|wa(@J#sL|&v%V`oeYkw7 zG!k_|S6LsAFHehzPp3^VqQ^Sk#j_MCV$050yE5}1t}IrSLW(K8UQqsXwKxB}i{ki!sU_cANNBF&8~GH&wUA%5G__^ z^C+y6Y|ydI&g2t_hH@;v2$_00?@W9KE8_THey1wwX4&i_bM~$M@%!0bnw<4_%#W1~ z9a1+D&biF*5@%Be+K#DBZd|S&m{&eHiBO2V3jMP>)nN8MOQ&zJkeP;+Ok$3ZtkvKp z0mTHe913FiBqz4uL;&-unSA=A4R^PH6k12`YEGv{)FRlR)A(Ph4f&GCyk z&a^a=aM$U#T1r=d0*{C52V4WzAeantgQ-0wBOA9auG;Irc;zU#xiAjKc{FJ3yM5Zi z0ah>MBbF-FQv5+z#L3_3rZJJ++4?D@9lfCEvJh{3@(Eq`&CTIBY{0#x!Cx8C8YzfW0&a>2INl!3hpzwO-v_}Oln|xpu`d|y zqoRrQ=9zgxw;Tu|KoPFKIw2C+PsV~y4oB}G^Ojvp{Zn>-4m!z14y`U9rxgVPkF-xA z=uXqLjwGV2-4D+#A7^`+xjN27<8)XX*@%fNp( z_~T-B@}eQGX%1?mFNcj0LA4Ym$>^%8vKC(}+Yii*;*zJ-rt2jQ2R(cOjmqf99vY&T zzX5Dv{TS}a;g&>xC`1_~+F{22xaMfcJ0Z}?VJdzRSDVWIPqY4iywBUUPZedIECB2w z>6i|+twKhH1*TTHq{ap-#!>sjIkI+P2^M%q>Z8rJ+rc;=0Wt6a2Q0eMAL|k~@7P(S z3Ei)&-B^=iz>1cl4C9NgdMJH1-gv_xfRnvRv_lGY1$fg#&DaA33I>tIx5yhQp&;8QVAN!5eaZ)bCGT z>caW*)JMKp^E?5ID_Z0IBixS*xcw3^4g9rajn7ZT(b`#tyv z$nMo#XK^t|aEbSFmRO2=;@`sX-QGumFEW~MG|Uswk*nRW{&CDtxNMvdaOdN7$?1wT zLTukjBSF+dgoLN!s>VCS$rB9KtAc89G}J<51(*!m>fzOKFzFgv0T)b*9@XB|MO|zk z@pn&k3@trQ4^STxyEkSAK6Oe!;1CY_HUX6H7+Ra7U{(TmrpL2_IAPr>e1g8BVEw+# zWn}toN7CmlX4|0HC1kdP0J1XE8CPp@YTrevI^X7OGnqTS-q?*bQ8iPzY6(O#f$ktP z2}^{?p%~Dt8b?P zj|>{c29jZu$C=_fkBJw@?-=s#G5!D%k3j!Z0>yaPv-yJ0)@ zSA(E8v;E!2OevLpQv~gq(%|IYfaI6tWLHh;QfJrcXhT+s^~;m$;=Ra`s%JFuP~RI` z^FGzsS9JK`&K0&TX{GV4dGp)jG;j#{MpYn@#77LfPh-Rj&7+PraZ-_E8_MhXJK1gu zOAd)nvs;D^J&Va_;y%BrMWHtdrYw;R)=Zduq$#i&ZQb|yfA%R!TT_GF&#R<(mWwv-Ad*XEJgi&P@QO+(Vck!*AluHH_9W;ILQA}i$n8_!o>zW9R>vej_P$72CZMIA(STTULe{q z@SbIh>autaX31^5&=(dM+MB=->yMWR-_lDUKRoQj5$7fblEX-(0G)jssdt@fsV;wCPZS*2bZ&%$mt2^9U&&P2 zh7g#|RPN5sq$;cT>fDF1W}|PK2~UL=6+}}aXp%U{rdUuj6~uYEsT5N;;S2Pfq+)(< z^_BB|_rd#kk!%}UWJDBVCJ#XIOJlEP`Pkg~FBE~kgmU}G5zK1ghQYkK5Vy~Z zIl6#3le9IP23y3`uHyAekj>gw%NW^S(lkQl=V< z;P@AhFAjR#+;}w#6Fg8>TbtAz`)?MULjMG zW_&jVe*42ey`d}xD<L z*h1@E4J7iwYul0!_2ov_C$bHB9pr^Yo7PoPz;JI&1jPB*GaD&yH&*VMcMazmF1e(u zFaGRHK*3(zx?qz}VSuH(2p05nll~TA|Uda$y-U_2kiPi$rE=9`1}cjUgJK~pR}N& ze99C2CXjG{3L>%%nVRI@_L9HFcf8%!5Hoz9z}Ht(Gm$yho*#93A-G_7G{YFUd|Q$Q z+g)3Xr<(_~u=-s_<&}M6YVp@P-0-;`@3Xc#%TOP5iWY~j2X3UWe6hY6HR2)xI!gmj z2!N0RI9S+!RPgxBVjxZjB#Rrl#XBd711%sFc0d}bs_E=uf%1SZys|i&EM{GXMF2f zb8&M{FSiA(O;yDljZU05oq(^jbi~i;&}XYeOT}HbMHxOU!QSCeKF9&VA>mq9N)!&nOtmvr~wPCrjh4JJUC|!n8 z3ZDp4o&2XGdN&Fc&5bR28?2;Bq%((WNzK+uy0qdy7KA$96A7msVb{qBTd|w>xMvHp zsG;o5G=A2aX40RaK>6%Gz(L7uCwR5~1HksU+IJcPgG>cpCcN0Tq~8WbKoM8i@du+K z#6mjm?0;VlgpV_g@66!;)crBL*#7o(44*4_J;sSDIv7j6)km(aEOeWUNfg>mvif%G zsR zGlO2_*PSiH*|*To&z0CKP_K(^9!-J^B)OW(rlPhddoUqqU5H9ilM4||5<3uSYVq-C2$JEX)~B0BO+u)jV7oRR;u&c)DN-f7hPI2V z(|)wz#X$bJTu4lo!T!U5){72X1Av$Wfc8b?-noR|Y+<2X14g0-Ak1`QP)M1+a)??(10S!l|4BZXzlYemaoPw)v1jr zNgY{vUiKg?hL61Jq4b61>w$7kky6w{c0->7B=Sswk#65}(^;mr()}bvzWv~t>opIu zGu0E*YAD{#LbU`EoAA}cvQV|mVw!m&j3~hXIq(%5angT3u&i_(J=xPH8=SzwnkOKN z<`Fq-9BR@!!>n3632(2p@QNcw;M>q@`oD4tx29}BeaZ6HwSf!<8n`lZr7s!VF&@sh5I2)8vwKtpJTkTlHm zqtVts6*PrR>Uk%R2aU8}8r>2`U1trf@ga8Sz!ojtN?|xx5_cpCj z_N%9Pb>DMh#y@Wdz|%7zp+!@mrLCbJYw9^OZ^#}JG*Xc7o*?^ugPH3gSGfxAAF$Ov zO;71eK0@mtG|t(#5)!YPU!@~UlIv{VbUBmcrij~$z!WokI3g_~!s zL27MW`h8mZ_qc5z4v8IB_te^Q_wEQ|4c7?<|8F3Sh`W}tG?qKinAN0_bk}I+M00F2 zfmD;v6$m*53YO7@wxcKFV6!Q*=lP0ETz|_D@@Qs-Q&Q&4XI`k_9FL}xdl|j`e4QVQ zDq7-&sveW>0>}=Ar(T=f6OHZbj?t7mpSK5YELPYt+B=0u7kQyu?`;aPLjhy4 zg_w38abUSl{`%iv!L1fPZqy*Z=w;(T20{uOsUOySnNgL4C+GC?X3gi_$rQZl#?3P^;^mX)F3pH?++&@9?w7 zi=~sqU-Ouy$%p%3__@Q?h9TtO@jw;gx{V<)#jL@=)l{)T-0E00aEs&w(+rB3Xi7q2C zT;{SACl!f373kJkn(aIL>*7|kDgWHLj{QU>2FO*oi-6gxFp2DUw2{Jh2Hc~>kS!?6 z*6-E!&uc@f9cH+N9<)$anY7>#@|^<2NT1(UFw19kTT_!;M>g-_^k|_EwoFIjp`9DC z5KQ3ee#JNC$xa1f!r#iNlj@AzC6E%j@|C*bt3{u$X=Q|w;`!G#EraauidKH;hC|@{n^|)M zC?oHX4on0O@u?vMAn0kzkOc)(XDR@Z?U368A5u7Mp?~J#vU`5BrTBa)R=2A_tnkYFEnp9oSe(x@>;r&W{u(TF#u01*!1S50Q=TeG_##p3B_CbV- zQD``U2UUskdWa}zzCm8nJu%(4W^C%#khnw2T%_|$xg6Bl$C)|P#9D(0OyIqdT*gEj;mjh8!ucvuQ@aNcfDPnlY60C_&KCp?=di)VAPU={ zh!FC{Fy*lSwvSLx3rTKlYaHgE z8UaRG73-$Bkqteiap{ecy*kugG57dv9^bq-ggP_P72v8Q@9zv^v`)q9C*M9mf??&B zSrEg==R#Hjp4ct5?occB!#(bvKQr_ z<9vXiV52#vkjAC>^FD`@-c)(VVSi5na8I*G?|_P|66NfJj~b2AaW$vZLM-n^)Bue! zCqWEjfh#eLxQ~WUVMYS^cQHMY-9mr=Q+@p|>llh1H_&OKfcl7}`@S7rEf@ zjK4JH6J?vT1O%3TQAAXC{2GI)9zQ>@MMW`n`0&{D;bmOM%&FE9yRY14i9^f&{c}yg zTx+2NPsVEn{@i)Y94UfcWM>eJ^k2a0xEzTkhCC&91e}^M8aFnceW-wHCQ>QFt(87> z0_lt!%7XVC|55j+5Mh2$mr+h7VU_>@5oW||r6BzP0f=~+H}{A%@BRCPehny{faigF zFaPm$-pmVm<~av1TlqB#{rObp1P6jc*Zi^|mnxf*6Y6@AK-#yG$WGO2C5(K%kqbt}n>7!8Sw};#zg%WcV zXq*{g5C__^b6<7OUQ;N?l;|>?3?eQcNWMTse*y|=k@Th*@J&pGPHdZEi+6tljg}fR z2o`Ub!o4pEcnD(udh*K>wT5;f>>upUuz{wXm2wR9jU3h@3CCW4Xs;iN9%kNQA3+4I zpErNJe;7;FLI&|^utd5C!6cAez|Osfheyp(sA)csrQ9`W*>RpAcxFYws0z$l5^Y&* zCma^=f`I47W(zt(sS)vLtKI>d3B~&zcjnr9=}+#{8<|HluW$&Ao)2eWlfJ` zcYktdOzP(20$*2`auAU=^b&XwD*z-MNdPnvx>3zv-M%0eO`r~{Hx4QWl72V(h z>e|#6Fg4zJU52}XCz11mBA#=TfC>gAdYfgvh3K6{JhSBA_qO6ex_luMcnU7ke}Xu$*2XdN=dR z+!<62Dj74~Hd;P``qJ{;8IPQDdoqba+#QxNUiG&}tCrTL@4VYFpgrmbmCTcC2Fy=* zD0%JIsNcQLCJeGbXdRi;K51lmjH){jh-(`ezGzVjVSBQc4|0IorEf39_y!6#n^y0P z9^2PZC2qNtJt#*onJ<6i6$LMoP!799S0lXsIRea%s8o5YVaiQvuG0EkJ=`iP+42)# zLpKE_9mOYm%_TUmTq&)2VP+98ckKEad>aA-pxys*Lc`0jbT=*Chxtmd&m`a|wVW!SU&LXs-j| z2ITg7Yaii_w43oULLM27N1SDLznXL=s!*-UVp&#ChClvVibI0xlG78)}n0y~b!<6V=oR0)E0nIeGuS zI`Fh_v+GIP(oDAe&`Wl1yx@Jf!eiESbw5ec$bssqpU*+ zr5EM)AMuZ+9{>$|*NL{@;&uJP6;N0<1?_fy_xbBsIx=t4)qbhUDk;&Lzu+VS@FFya zFF1HIl|I^iK@iAR{`xAJc8?d_!fx*j1+QFN0q8EvLj24_POe$9smDOR=^)qzl5S+` z9$bQ|_*7%-kT>!@Jj^{v@r#1AqtTqRQExAHqO5W&z7jq!r3L4Z1#aLF)61qpJ5gQlQ_&Fu%W}JTfNdr&(nH6mn>GAh4S&2%qQNmPFIRfR5 zCJb3rRvvl>njhQ70*I^P^uo)CoV`3Dp$Hr-a$?}^000e9*2}Qe?u#5KrLn& zdi=`j78SKO2R&g+=;xmcDzbqy@0RBRo4e&lum1NFSsm@vdWk1A83rJ#cvvhfaXJX7 zH7pb^oTQcV-2QV#-0k7@p}MN56+?dbLpY*b&7o)jMq>QNs)ct}mf!iSzrUrsg{8Y? z5_5fqqVt5`#Kc(pex~=?edGD-{OPA`izSqvJSxhJIb%v$I0~~>ah<2&04lI=kfM7c zq6{n*^sDIRGPN1Kj-!-LxVUm4P$|TA+!q>=Q~YArHrUU@u66Y3FQ>f@tGdSB4hi3K zYjF@T+cqsz^qF#a6Unu9SA!ZFD=-Nd*zV8dMsj8GG6%YbPjjwC-HLbJ1?v(#UM4q0 zmc5vseLXjgOh(K$vov}CCY{**X6ivA9dCBQ7sSfTj2REv3M{k@S++B+xVSGua0LNY z4~6Lk?2aglaC25W4E4r)ruY6HOP?a(^--CsHoUgE;BD!S3T}OYi z-N|0s$bv?iak2+wDvTmkS_e%Le!zS{^u>4#J;s%MH59_}@_bv@GY8J>II$_k+chS2 zztRr5{^i2PY(^9jN!;j*$Q?3-yfEO?W;3XEZ*mq{oOv$>um3lYJ$E7~Ii7ht!P;0w z9?{rzlPX^j|JUr~G1`%LP1O zpF}@^F!`o2wO{Km4=q~l@NDlo&=Yz5bMFv<81y93i`-FilvWDF?qp2pK92 zod`sGHKnqogAg_|2vI{L-m8D;u*JaeK^&v0LWX@(nnU)}+G#<3gcba>3(A1DjczpW zm-3yeABJBReUQZ&zv)00J@`jZvH<*n{?59&NTr^owhp^u>)=*=ZXK~=hXlz0O>s5m zWFSS0!UwiK4DHL+Sr!f1957=OMjs1t1Hf~jek(e86(#@_^)H6}Bd|);u%TwV&+3POLL?c+_S2PB(qdjkC+>z!lpK2xctY1W8*B_ID%F~E)zE>+ z)jvY|FX0HmfM~)l{}Sg<#&3DmpI!mD@Vi04H`E-8Ii9&c`ER6d6)|B29C@~4 zRnp%j|GoCVU$O}+9?*_xD2|$2_tXS+i^#AFWiR$hb|j<0QpsR}1WM{GD)m-b9u6*w zU=rKCt^3Dp{CjmrWC{@Z8|_=S1=a)7(Q~P{>W{UbzZ_s0uqE$^vO}ME7~~O_r-SVz zJw3@7R*A1@S>G`l(Ed*XV8Sk0D5PK$2RbX{$dd14n$NS!zoo7HOuYnZn6c+d&4rW- zYc!Gy29L~$oqZ!bvMW_!Xko5MfTRxpvy)96F-Uxp{ea-b;vOh5_@L?^G;$Xtpt?*L z+&kcC95gi3<&al*f9ar-BWd2&vt0T+wy4kk|3XFxBOuOB3R-cVAF3M-LrL0*G-=$( zks+k6fRsWWofQsW2A!CX&4|!MPUc;;o|dk~M(jM7o_tM=V)$=?qJl2LfS$3q*yUSdS{A@}LuT-| z{LU&5yZplpjv+}X1^Mby80HpBqY;0XM**~$?-$H4I}HW<-?HGyKmi)w9CrJ)Odos- zqw_lX2~s|*FMyAL=cvar&6Am}^gku2f&Y^mkt z%~NMf{V!wkuU&TyM?wrY?Qnvx(R_1;M*r`AuJ2ayuoj%}@~t))m?p1K-~-j~KK>mp zXWb)(r@P|+(;6YcCSr%Gn=C44XT6LcIT<1*J=)D{jEF&<3N3TS_fz6=yqlDc{5k*V zJ%}K5NV)nSN^N>ju-SCaQ!83{R9eSZOuDe)sB79X^UT&+zNUBf2UC=czm7HMT0{q{ zYQ|;f$u`x{6!IW0c*|oy*_8oAmv6`Yp(%VKDG2<~2k#NrvCP!&Hc4U1}>LioZFmX1n z8WZx3b32pwQP!_B(Wk~EEqRnyIgTay7p0Xw+)ZA>>zSRCxf zdvZMD!%I2I1Z#mRGgyt3fB2nl6GbdH`&1I zl`PrsiaZ6yio~^aAm0RS_mjLAo&!Y04_}Enp{%!9B>+Oi2EAV0+vF**3`wj&jRJJg-Q|JgGi86uN50QE4DWpWxv zK{89wvrh4}Dx4jT_-qtIO>qr>E>=C~IfvP)JklmoeBgdaqedYUUQk-}PG13V+By?QOHT}D)qm={0gub_Ndh)h|N5vp>EcoZweQgT1<8K>-0s~z)*YZ0tOWX z#nqMqNe(k@rfPRTd_)xY_qdDmZ-QcxK zR1qzW5VwjcZo!2Z8`OAkGd&pG9>RI;sH3Ij=0XjyXbB=~kd8hzyV;_6XWyZkkN(eR zY0n)_cV}NNR}=m~eER>gNR$B0G^=zX!9*0=RVfADxr-v6x{@6yopRzOW1|$ip;LH+%hqNY$2%NnM%A7_pe+mtFn@3hpq!dI&-^U zlo5zO&zwCiiXo#X*~7APA?BH|Oruu7VD&gG{{C%hC>dfDIXyn246$dMd=#~pTV=}) zQhdEq#p_&5>D9eX3Me*HIA68Y`e0~3Sq$Z?u@Ug}u#^x2;l2laY4SoXDEoWjKz2o1 zQZ_m+2OA0t4GL0N%G~tfl;!LSOm-1n2sL$P5vtrFIzlJr>Uvjz^uq0z7PI$*%<+OC zR=biEs+UzApG;a00QK`k~@d79QlG&T>h}|GLPnX+z@etee zo-*B9=6m(km7jyo&ejEe{rW+e|)fYi6H$Fp9B@P=b3#B!Ovb`idn6ms{?XkkZ z(DSAS)3HcVtx(YO^tFiG3A62_yNjvIS0W`Z5`ZlR>(|n&F*mtQBhqe~%~xN^@7mpL zs8an5)O9P3F<8=69*4@BU{WZk7~Grr`?m!Ly5_lgfYQMAB%NWduQyX`2}k#!_XzK* zXWUOeHfdnrP*LYjO}G7>78LCLlh8>n$tu`E-L1kTN92XJSf_#9JtP5_6g%M$5d#%u4AKkfW9rNY;DN4AUV<%mp zrp!qY?kSGY!E8fTd9QvBF{Uio%3n}H-4T^`y|*Kul34pG zbe?|CN;o?x<;%WW>saAc0z1%dC$pBA@r;}B8=pt>Tg>0ZdO0no^`40jTS#x`2FB3M zecg!7SGhm>Yv8SO(dXEDP;aH}&t5}*Pf8NhplQjWK^7iH40&H{4DIN18XmrDY_4Z+dayuL(5XAS@>`tF3)t{gAE85iC zLIB8px{PyLPwy~LJzT6wfmF&+puNDG01K8i<=pCSc0x+zRN5cidAF8%tB?eLoF!cx z8@aj=Rr)Px>!LbXq;msSd3Ry;7w}36ZHDrO=`noXXUp_&rVSbi3t z+*36rJXuh1i&n9Ar#HiYorq$$H`YXyuLkw>^7)-eIP%aB)8*1j@=l$FE)HRrQcIx6 zv(ABJDBjjhb?I%K;e~`e37Kp7;vPKy6-(d11e)U(GJ6}X5VR?FViKyehH%eXc_4v7 zfi;KS4BPO|-^qR%6zf&8>OTza=CE3qZ9JvaR9A_Aj6+=zkGhE}ZR+5E zu|y4Voj*oZago=nVMl?LnA^Kn)#go(zTpzs%OE5*8_2h55JiN>ii^|D?0{6}BK2mB zuI^!PeBjsl;Ybh>Ep&gCK}u1Ny0xakXJ=h_OL6dv)(Fb8uGBt^(|BUKrDRhbf--}b zv6M+YVcXP30zY9Hb~^H`$STx`c?=(3$UIet7xTkfb)G*Eqv|3}plSB%FD;I71ZB{- z%`R72*8N62QRi>C<0OxYPqQW5H-t;@XVzCU{|nqeBflR%twroW9g)pdnwIOLE6a1J zJe$oENJtIYhlEMu&p$jw+ZqB;6L;n04m21K`@y?sWYR|mAEA#A{SG#W2XSHt5)YU{ z%OT15vD!qdDy}7IXCzRT|0DvvM_}iJ<@PG8`vS$(AAmY|6h;_`z_-1g80?!`p_2Y3 zZq@$`*5-eDUd4%ZAMN!H%MK|+00ihB491nu=aiTGANdo#vEp57Xl(BD*qnAaFE^V$ zcjaQb>DtR<<9zR@57O#)*O3odO5zN0W9xhJMMc(~J z?KoGv5J4W^38#^fIrD|1$Vzwxp9|OFY5D2o)apP6iLMxvO|uHqsU$7ZomIte?r)~8 z^=)+f>4kL9jAHuP+C#LvC4ew8iHE=s#>k;)S^^rC=Uzx__WcZPx@7C&BewwYnRLpg zVVKfi`?=e)yF}oWMW9l3-lH1&ze7u$J(NHIF-?bb@;+!M&QFH@yHlip2$Xh=58Co=V4j~p(pBV~|?Q%M3@`Uo(*bC>* zqERJ93G`{5k67Bby}?Ig zG9C2m^F}9hV{n<+J-fY*K1O&M2nFf?t=dojZ}tef_pB27-G(FdNv$`*){qAX=mvdK z6QKDcM#DDI$%~Q}D6!603>y8zH!1VJ3t&emi$p*o&|?Ia{jt+))7(}rj; zT0GViT8N#>U-{dqOGmg`e_r;bef}Qrq--b=7ytwc3-XEUKopj|aZPm@mY+*phk8i` z8C3EvzGa*q4%igarZ+Uz?W1)s!fpHLC413rBNa20hOk(DQjI|3s6)NdT>s9W4$Ub7@&LL1ZptP3m`0=rbpr+apS8zD&16{PQr9sTx6Vj84 zSl1qDr8i(3xD8~H3zNfof0(|%dOv+*`fwp7`~)FqoDiY5VvN;?TWCvtgdA3TL$FMA zQNDX3wIUF8cLg5GWe~#t1cZ84W|;?K zWag9=`jxV;tgcrAH`5zW_1+3K$u|13=%KZv%8Y>Z+aQ8pK30FYydzGaOPDfv+r!Ar zEzS^W<~sLvz;-YVA!IriRvZ83<0`sydLd08o=#T0`m@Jyh8>P5X#W97WD^W7*@-d3 zUfj8Rm)~fX31Q+7e)tvz?^{HF=+ZzgkO)Wwq6jF(7fmcN1Ikkf?J||6^(Ra*k=s&L z=jqMH!;os;c%GCHo-l{*M4u>Z5QRxo2%#{7P_gQGhOxt>ijZkm4UwW@8)m_GzMfc= zElb}K=o=Yayx5)>%KVl=#!V{0$F%(*;J5`eMeE8!lFSd1CH8Pg$5Bl1m`&2OyG7WX z@LK9_eQY@zT2YZ^EwU|~IvIv(T$*dxo~|$d{LQrMY2jKP>o5pkB1F*kBaqZ3*j!Q@ z!T4!#PHmNtbqWiOcDsWd2cVB{6#b5c$(D0pKiC^9)A_*TIzmw>*KVa@E@-RpTWdd- zVe{D9b&SW6)rXrp{TvcPo0JeTp0Y>;x+1Xb7vpmA;`a+&GYD$S-ohtP5%&|*Wvc2T z)tdpw68gpoGm$Y6z*lHoAQKwLkByGsx*9_N=Djd0E zs+5!On$n6>p+_W6QPoDAB0Dio7S1Cl&ZqHsyRd_hUYa+-c}Cr?C98;*4q8yi2i_fh zz7eo|2~6r*%t>IFd>=cO>c}hQ*PHQHM3jNJfLu1#df+gU(N5|*+Sas%5KFLoE%+AL z3r@~;#-xhrkP7C547zY3*_q1&B!9SP-dZ^J{92ZcF88y_*leUfNH61#VpPc{UY;0Y2431G7~O!cT5G*&ib%W^ruEFh#1vWvJK z=l0_41R-odG>t=z0m{#SU;~-Eg|x6;uo2fqemx2Ty(fc{H*1QS$ySz;*d_R4nwG2T ztZn<@lWoxQ$vq->4Xv4X=c&z_5%zaJ#z&cM$0}8`n{|dK;xW>(IO(_g@Sf!qn7)Sc zcWY^_!$#UP<4tT7X`Yae(67v;a?g7R4ml`f@PSq1Zc}vg2C%xbG1(pwLEb6d3{YFJ z7FheK&>cB!ukLB0Glr$(jVTer(+k{qaWZM?_IeRyx-%&69BhKEV3;N%&@|f}*7-t| z1A=)6)W=P*Eo5ims+M(~yB+Jd1J~sJN)9={^H2KS|6WP0$Lb*0O9W1K1Xe#hZG6}; zt~N~NTX;4lUhg1+qtCvVhE2SR6pNMW_q;;~*Zq#X4ZDvEEP3S@i1}Dud6ZdvCRJ^I zj%s(l!f7eReE2Sd=Px{s>Bp-cp1LVqvuXKx742So$7RNHqbCaj9C4)qkMjmd0(D3{ z(n0710c?M?B|hPzd)=|rYPFEVrr{YGrY(oPG&0Wtp^2r}u>zwbpNgNoCxatBisE;> zpsbJKW%xaZ=&irDOX-%zma~&bJe}7~twUV(-miRhv6lV+0tyrEm=VNP&;yeLx!bvj zc!TY+vgUoMMzts(!nyehu}(FLC_haF865EP!0K^dKv3Dcah8w4#u6V4J=l6M+=AS} zn~+a<23c{zEoNve|c2{a zX8#-6+z9vplA4}Bh16+Q3I|)MVefKmCvq!o7q++{G5odFIsQVEwjaSGIkGZkvylUx zDhRN2&j*1-V_TTo@Eo&&z*#kzMB%~aKn-GjfKzATnFVWhaiTE=Wy;)FYk?)Vk9P(r8o~vPt1$ z*wy4iNSHR-(deU>b~n(UHdoUI{GNay(%(dE!SBy5p$8U@rh8`=QxW>$x{26iz!8O= zQTSpD!IsdD75Q$Rw%5J{lGx|Nl!cS(2heJN6@(B^7Fi?$rzQf8joMkTvs;Xdw4^fv zg_D=iut`^w)yW|SaY3TA)^4HZBOj9<8vJ)Ce@i7*Z+{8fj@%kqQt8f}Ks?XOT1n~lsd|t<1>JK&1!RFOC@hjSCBB?)3mu4Qux-%~%n;rAgEwjVvG+{2kO-Vy2&{Z?dOn^`7sBF#%|SZuvx>JSGA!oAVk_dqC zHTZS%;3P9Z;tWG4)!Ry1V-;Ci>PYe8g((buAP6H1GPs=}h4@YgQDTGI*p7jk{3f;d zLm-5MVg=UizMcpx239Ht>0k>j=b(682fCP^cb^(^F|d9E8$kp_ycOqXAxpFS0|MLf zc>{H{sq!y0d(?NR4Fr%MB@Jxn7x&h~YTzbZXgeV(Zi|;HgrZTYI4wx)4n2L;_<~}f9{giMh`D_MX&7@W-l7L97SWa-bdyaa0w)Io zmhh#JMa;zo>WUIR{#0#l8geyh;mBji#aM58@Y4Jsd(Crv~$IeV)lbP1a2oerWU^b;+*om6|`$`_1fL+gIs)K zAi(6T1>VAV-$2GNi;xB)QViRqLfRJ=lEN_mfW4|?-zKs)fdKlNN%MP1hu^AcwUeHn zOW~{n3Kowh!|H%{F-)e~U!-hshO}Z_9mZJA*bb|b`FEmD^Tfbvux2^1WN@(dVhC=h zVl&xt8pqs*u+aCwc5<{h8&fdPpwUJ<>tCT#q@^p(I15A&iMInr7o#0qMj~JFyN6q8 zbe4n0W;w<0RY+q8;UQ%}9Phx}Q>I-LVP#yJ4{vE}K?WZMu}sYa37aX#G?pM+3H{eQ z^vr)Qq!lTEKn@`h7}5wVdvI2XqO@HD@;4I~Ccm$VVzIes_{7f$XV7q5^=`vj24#&phw{fRrkd?9#t+1G7&P+BQ4nBtZDX4b;s%0d zL+(|uK*%DX#e#$n0uBy;ri0X}tqqj6?R|3Z_<$^JP4EN2)07z>t9&7hHZ%u?)3Yfs zauT(kc`=!;G(6j2g9xI@JW@y+VN&J8k5)V*Z5Ev}pgxwNXObVBl#oGHF`md-^p(^w zh~)E3=~9IZ7n7xdDog}(>&D(?sLDNf5)`G12=aV6)I(dKhF0$RZ<;^)KFUiwou(8x zX-iWZh42OxzhAg!Xn(7po*~@Vx4Xp$gt)cNb96l*l}ZlR_{H^ME`Cd{S$7$4#8gf!5B5H%iz zs%e1+&4uS62dkE)D*`DYgBbRF1XArf`cPbg5PF!_#{)Gr&NFPSw_jvhlo>A zY+gFh_%>~={s&ciHb%Rp^b^iQ**HCBA_&DzKX``@|7am?Na+UTU=o2Lg1{>emfJ0c z1?pjwJwswe1p!PiJcI1%9X?g9AY&|@)AhvbQ-NKf%~b&BjjJi6Xa-rVZrJU8mV)py z<~W3G-`AI7a}T53((@>{Y#}*w${_V~BfeoJRc?Hmba)L%3qOoKb=zRSxRKI_pN_fY zf)65e2O^4P70-lp@a1Sz=84!<^&ALxhMCXO9z;&ul&aj|-N8QT^E7L?}+2_%`l7&zkBOJI#2l)$918fGpAcX;3 z5xDM%152ktHJk;taA}4eWDpl$@FO}<{{d~O{<|Q8dJnRW^mU&EAtbue5+c3gZMwhW z{DC9neVwE1ClTl`0{Jf2SfAe@*sRT+ zPlZ$9Z9M)eQeg|lC41DlRJZ$W@;2@3Ga0m}6(D}#Oc1=O7!lGw{4PH21~TA5e0am3 z#df0q!u}>|KD?GPi_SpEn{&||2G0nAQ-C?u?RtxhL;^d?w5XF-HBQ`3wDm}I4EZS$ z=!}340>_d;i0vR5gsBo9#cbcsVP(ME1i7<#>dCq16SCGHf=waR!ENwx5AzFC^g7`; z5U%_iopAkVEe(|Z(d!f#HHl1zTWpp!VOFkaoEiEl#d~Q=)TPwyaFE1DEGBPrdfyD~Ex~jON^Q)_?6LZ_M zXAk-P{#gIg(o)LJ%_WD!(Pe&}_dg|M5IXq3Vp7M>U)Fi+$KyAMpxNoIJr&bnBB*6J zm*9N;D#jZm4_cEBG_8h|a0fORrV06%(bW80;ZV{PfOnM;yW@hv37G~G$Ye0np@0zD zX?x8Jw7&8Qs%-v{JV93bq@Emi#uZy|;u^jh<{*xWH|VDo7t%+a+sNM%ffE^lK#&%J zXLYEDu`?E{3*NZnDJ_3eY}eQZu&MF`sD~48n@j|=M$Dpu37?4(L4MfP?tGQJ^*f-t zjRb&>4b+P-0jPHy557w*rR1Q}Ob9i5CKXNlyzpZ7KwWJjw`8<%@ayKoAHrsF45Wf3 z;IUT3ADl$#@P_6PIB~^-XTVuTNZW>Gk_^THBfoYaz=AvvBy*f4P&Dg z6%{XGOdZ)S(TC@v1HuuGO?b2t3?Wo2Zub!4tJ@E~OpxN6lZTCrjUZQQt#cJJODBZE9AuG6Pa zr$vhvQBhHmAeGVib^c5V8HBOtBRFUsdWOzh8A`vEaHghecZicHMe|}JsAf55;LN@r zuRMc91Un|rsp@>;Mu^^VA>jn)Ji{W_a7UBaHyv&G{iQ8f1KUFmJ;O20a5W85!Iqr3 zHZOzi@Bt9Q%8Co{@IboBLE60Bj6`675in-p(PWR`h-OcxjKb4E!a5e$?^_Nc$kL9u zQy&j37ecsXmCT8#W_b{PST^jTBcJ{sRKy^Iabzui8$J0RY^$M$J|*1 z+?XgHIBif!}q^Upt@ii?ZI`eggvJsQbcce_m6)U@pJ=5ALHp%v*1uFumfHk>0-k#qkh zcmKQNiZwDX6GYHd=l5^4-uHG{b7|7B&(e(ITj4FmnGB9zERl55G_&M3IFY2$<{B9K zG`x*COiT&~r{KD@Lrec}AcXXzH|U{_&(eXV($;8jz?WMYFa%&Pn1R6eGjUqSSf2=K z0q2YCk@I5PWwmU>-WA|^iBdkRJ&STm<|3@id6Bjtf`Qf}wENxv6}E-30s8U9-+Gwp z_r8rMtb&}#-xPL(JlwF!*HHDgf04J5Z4x`?)mpn1A!f2+XLz0-k|ENOh@l~?H1S6>xG zk=41puArbm5Jn!qs;Y`!eDOsg@#A@2eDTFXHO<6w&6+jz-~avJ^wCEj2{mv@Nr_m; zWRZy>tE8Knn&^WMJ`lvQt*uQ+Bv~?kllvhayn1)Zy3D>BV2{5fSV>_SC`~pf(4X z*?|3KLWqn(_R0D55IsvfB_SLzsO7+efIz0zH4~W*_)g1@Em0KM{IP9bG-xwR_F8H- z!5O4$NYu0fs9+&Mv{)nNh8+C)$d;wleDM9~a4Go=`5Iw=_@;19DL}Xwo~}i6Qo*Dv z>EH*CB!rt`+d*H`Uh*~UBX|CI@zCYCgS=0yc8-W$#13cTX+18}>R@r>?vzYa4suc< z06r)rTHt0lVL;GOS(PieAjp~p9>n(Q{p4zDByHkZq-Euj>Gx51_hvGy_d$FUj9pl; z%ZF$Wr(D)>Qj12D1yZwcGy1nQk$vA*3Y1M0giz$e#fI5#p2;MuhB@X&jDRLVm~HOZ zcJKAqUl)=$CW2F@OrdM8xkivUCU$Js$LiVVpMPGELRJI6^Ugaodh}>2EiD!5 zTo6GfUyBznrUeTY(3mk}C_g`+n3z5B#1r)9n{Nst$o7YqUw%2AefHUc3^JKx_3_hB zKTTVVJ@k+uf=vEcm3-M{FcX_Pm0T{DAb%f!{IO6^vx{0^ea#_0O~em?tdiL;t)H;`_*31b!Zcf8*9hbYae~JL5xpA*tw(0hMaUU1#&glO+J7RNJKn+uu|Q?~b=(KMV{_;i6%|yAni`Sq zAnt?Qlte%v5H=>`iPK@!gN1f@1v|44W|X7ra)E@SxpH0Pd)$Av$72<-GkbLVQlyCV z)>F;47vowb|EjQ51Y{1c%c6mSz}1~Y)pYL3-or;W{SDs5^M$uEug@E`kdAEli^xYD zC3(D@V-Yr2eH=0jXzS3d<8pgzE(ov+Qvo4kKFB3@ z_Jl)ZtJ+WQBY5e6gi9@*NPbIuR+2IJ{^BzbBkqs%U{+~|(?Vd`!i6Kq2hn31 zNSf9GzctMaume8?d2uuH1eY|<|X0e6YvuD$-x86!;oN)%FrKJfX z#w3zexUA}Bg2zPgYhU{sv2>4Bx-13c_Wb$SV~-K5irFTR*RzcxOCs4$kk>Q$y!qyv z1>xkmvYJ|l9p>9{mN(u;zS{Zg2jUEEmp^q><$ysCW*2kEf)Y{&;qX+xNjgDM9}H3CfX_}SI1b^-UG z5jcMn?x{9+9yv2d#^%D3L2vE$*zf2US8ln;^r0c#3l}DH4Tvik^wvh3bp6E5QGSz;2<-X>9)VO~og#yiyj3&5ob}o3yCO_f{wj5ax74}@Q+MZEJuAH&( zaIO_G2BUrSphsj!iT>tKZr8AHC3d%?7%HXds2xk>x04V7e&gVCJkj&14?7xv?x=n* zIhyM!9b!Yvl(T3ZBy+F4`Wh`-xRB?^5yjPuisAPGv-iwOCyDLA#777t_N4-dWxUkvB)4x?e^{4Cv5iEYnW~AuDId~ zDl9}2F+A|OFqvX0;DQAU1ZiYR9@_;nS-j|?i-dZa9X!~J_ndRip_wyh3L?mT*|CI) zB1<26J$n^%pHZVm#XNp_J2^QyLM_bgxDR_Ivo|xVu$io~monQIvJ(qS1zF-4ogWiQ zCZ+6v!s=osgRHt{X(RXNc}CmvoVY|@B_rPl^nZgh6Wm>CfOM}GCqbQJQ3FbAn>Zg# z(xK!x8+keIE)B2*h}oRrEdq(tlzPzzZE&iHn=uTTP3(-1mm46En0zOxpVEYNq94X? zvp8TpkfP#PG`d8!82^dwk4e#xJsJl4PHtN+O&NYe%7|ce!`aR;biufv(zM~9hm>&e z@8`H~{>!D(!vA=c@}hH+pAvx~gur~vWezG!zLH)bx~cNIgqKn)GI=mrix!rou_H+5 z;>;Wcr;(0RpRLH6(+HR}$VblD>aPJIu;#N0$B)4xDt7u-ivE`OY| zi)RbZ;f_v;-vr@=?P7e%7|xC^3Bpa}D)vKFd?3CV)ZXQIe@}dT;N?3F@8n6bN$4zp zoX809NqQmb2-KL+rl&i^k}OsYbK$cGLP8;_vv`^zjDQ_s(FigePWt$h4Z>#cT{uW^ z>N@*0#1C|_4Iw%>Gf0Kh&yqh3nM}N*-5XH1zW@GOQqwcZKB^ol=Vo{qgGRJ(izys$ z+W-v!5jkdI$senSStZPbYQ%^UUC0wVld$a{t7h}^@`MDA)wir>X0pa)izRie8n)Xz zw0Ar zqBBR_p1cv38fHXrp+Y~NtgsrGRl<==FtLS0%NB%CQ*8)4^JKfHabla!zasNz82ZPx zq1I2w>3KaIyg0|{zdCP6{+0+FX9RA+_7|bD?&mqw=TZ4wcjA|D@>xI%Q&nI zhi{1%6C{tFI64;x@&Pk(j20$pE!DBxV03ZplgH#Zgu^%l4Lp217gx?0Dn0vN+Vb)p z*xsSoLovP`dkc385rZ^!lLQ&m;~H|i0NXfnuxqHZx!B>2%ge~Vd<`5^@y5>zwi7hqPAtN{;D&F)~yrLF(!YUIfuu?qd$Qlg%G}m zL)ft0AkX7yg^3iCD^|BM0b>FePw1k3nV2z2W8%n#NtPhI=*Rt8Lf5$;j~$H}$OMhY zXQ>?%zWBo9@Yt+MW`_|jyo~!ZN#(-x<2mqWvJ#y?&yVNBYHF4yCM(GqL$a3rUABCA z7z&S9k_}Vy&f~kWoNJd-_xj^Uu<(U0D==OQE#HOZT)UL&*Z%N!mxU=>U>YhO3W^hl zre7nnXRlq$Kyc`KjMM#C%sJimVKjAE#95@fjWQ8z^ue17?Q>k^NtfK3P>PNFKjHw!b{G=Pfk?&0W@_&|lw#*Ld#SG`=9!Q_Gy7=gW*`|nY|h5GNPcccCq^%2zMCpT8` znPNv4kb(>=UN%4oLCQD)HRliZAmFs_%0Ns&jwyJAY;7JYh03(7tc=-@Ac%o2>&bvK z6H5|JzlV(aO494A$(~n06DLfdNs|z48idG%14-b}LD&ptk%`oFENw&(%yv6Jgt37) zac-JMZbzpV8O$$Qm~1hDV^uJdGq zzI7n8tR{{pj!fiOEzH|s&*Es|HY|-~a>pc*okI>DJSZfLOg^K9=f~k~*p`voacCNr zQnCXI_w8IddUjsZ*WXK)SYS;V*;0PKNlTaNv7r_$=-A%!<-9z?Gb$=nTE4vF=)|w% z^Ju|>jw6t`PQ|+Tez>c(m-uZhSYS{^MdY<2y1pNuz_Ach@0e2`$I5e$r#Yj(NpJ4_ zcf|c;+n@*>@xw9MDoC45<8m(%Uc>S0;=gl@!F`P@Xm7(Zw4c%~8GLKk|DzVM05#>`dpGaW9_R@bqbP@wkWRiI2{SpH82?16LPJM>5d4 zLzL2|kz^-{K*|yL5F@gh_zG0K2nyTfpWyR8RDKx#3eT+qd?HN%{UF6Gwb4Dd3fa}(feJqF< zRGcOxa-jprs`2Wxq=wsYF5_IpON?1pNx_Y4$qXWPU+Gvc5Z=fw8PhdGZLaGIrO?A^<%VGiQFeED+W)qCTOHwuEvk~Oy1V}}k7 z3&W~cmf*z`F<{YcVY10~er!j`WAEFyPdK5lO8K>3XvS^U40o{9 zqFK(w`vh4`YfBw1eo+)pdI387_>Spbs6WQ7SK&+(HZe?khO`u0avdtJIK6Nfk5MjQB6m$x;KnxhhV>Ha>Pw*b(EU|6H zqsg#4N#FJ%Wp4R1Yy{nc>=~7N5s11m!dCd?Wbq)p;q|R+$vCi`0=Y0*K&(N-+eWSK zENTT2)boacoZ&^R{e0&5f-EIWb83PJb|$Owb7jYk`Sa%s#}Jkbveb_~dRanu`st?& z#||c8EOBG+Tqc6ODZFi#?6I_w;|MZoi^dY<5HV~g$lK+yIjA%{w8R%Ch3r-Qjcrc+ z$kfzVvC$R0;T&y()70qK2!a4_V(3^s+I7%KypBWMY$M}*kiC1cyd0l(TF}p;=l$Fd zZX(ka#e4#X->n(SF2mva92Pg^Xl+i@Zod$_^&1dRcoXZ}u{=fwbw&RXPK492%!a=A z4=2x0tB7jxyZ^;dDlyk#7$~{&y%$?x+rHr$r_sgZe@!oL`D#K&kdaw)Xin+9lSt5``a3sL2YOcrd}^!eM4?u3ShIt-?$rS^L(i z4dmuDaUzRIvKEnL?2XKG=)T|q-R{B6Z8)}JG6KmIQEiWZ$nC;f;Z!PyKRJ69{b1Vf11NWo)#T;ZU&@- za6i{L-XH`-Ab;W90tyujqwv<1WbyJj#@7S>A$=WlKrVa z8U+^KK%v4>;ySaTqZI^@yZM6#x$r&9)iuAb7&Pu5OZdvl%IK=At`bfcfB*a61vz{B z?YBjsXSQKv$zaruFRp8suiahmES+NyVzwE4_~D0zbdgoX9Eh6LxjZ&kwh>HLxIc%x zVf8S_D`djT^LrNovYG6$jU%gxxj#FPaBRUZe({S!+L>%TUY1fa*xg1>w&ma~Ai0QP zm;y4$*zmKXFk?DhJ@qL;2su?;Il{fn9(B(#iQx9ymuThQACnhqW?u-@x)(=u^}e4{ zop&287=0fI;pyETrVGdYLagJkGyYH$vX^|7&Khw?x2ouF2RgA>%)DY(p&o{Dcg*$=#0xfeEQ#wJ2QY|C zBWzFT%tCJzj!Wo3NE*%vlB_hs)0l%lXBN+d>MSalNo>j4OX_#M27(9GTauz!timgp z$!E0qTPu^3M@R)Zj7_xo8u#IeoM?H2$F2w9c%p6O=ShhG3qdYLb)d$-4BgMaVUxz1 zoud{9RJE+GZG$j8WPx`*NE@f9Q^EF-BLcR5b|iGvNDc9&7Ac)6kyrz-L-B3}l85kg zkPafgUIvtbSZKpoED7X4j~8iLu`Jt#pu?8fds=kpq@PU47A%MaiDqwJCS2RMZx>R) zs3eeW_c%y2JAiO{IbO~ZI9B7bx|Y?*EFon{UuS6?|K^Y~yq;|ZAAR&u5qFSDCX+ZW zOiDSoFwcc0ku2eh7Vgj4O1}U7?~4#OtR`l4Gut3W3(tewa16uSZ@*pG3r1DV(Khj) zv71)>!oGg@wg$rp8M6~d#)*T#uey7qV>M)|dbVzE!9i`nO++zNv#~kcC|+3+6uQnd zOwN+dHrU|RMp38c)XmTS%>I_pWxQXL8tdedx%eic7U|; z8-o?6Ol3$7bZ0e_(5)vw98Tj`0iW_&wB`7R@w$_qbWhrb31Pl_B3&`*ceK6kUo^8A z>Eg7^q-~=Mx7IvQ%Xe46{=yG3SObGxyeWxyq-cv{e{QRJLA>BI!7I<>=Uwu`gfP=l ziaDi$s9sEI_TkAJ_GhU=FC#_W$Nd>X_LT?>5CV5%+y$tsQ2&hjG-^UIOr-|ToCGnP z9&Do^4Bw-LZx%vdPfKxh#HeMcG8GD*En`2 zjXRxa-!`yE@K5wNod_`vn?NP#7rBgi85kGB(!hHk-QKLZj$xBb{s z!RU_gd|0B!r0$M8?w}iPxIu)A;cOnPf@OO>PCduAe=MEj7=tV^{o==Gvc}_ZW|M^r7Ya2m+xYQ#Ecs(qHQNSqP;1U#98U&$943TJH1EFq zZo2Ne>x4>~C4)>(S=G()4Oy+twt`Gtd7q9}Qc4D!mOt4{OO|{M%2*5X1)7xU?|5~5 z!4j0$9w_m?Hb5G0tE5`l=C)<7K zJFd6=kJdidJ(gxW@4_{a{B586vPx-Z-D@!-7z(!{i--?5=MK1!wvEo~cGkU&9FhA$ zDg!j3;L6UcW4~u2+X-KE-G!}*HSEI|kig~W_L8=Sw)dgC>>?2uXas(W4SWxECu-7r z37%s$u!~P1gCUTyK=a{_x#0$$mOH)+8T2*oMMe)MgM1sqH3kBfReUD0g#5LmZ>Mh| zZv*ZB;8A!Bze0JX=TZhdj18!Sn;|u<+4(X8R>NZZC@Nx3dzVulxwS@zZbdj7BOJT^ zip463rW2mY@x|AIed>C@X;T$5(ZDIbll*=%AOJ>2m!tAad*X@Gi@mczYFCtHr~Qq7 zme!CBYG5m_4GW}UEU`8YCgEiEk~-5ooBFwO!99RL7807*naRH0)sw_w2nK`>c$%;WP| zQHdb8XU7np3y&Wy+>S{lJG<~4ue|cg*!;MEbUxAcNBc}E8N`OzdpJVYl5G_PF4>Lchm1h&R;xW#dN!OF7*Y*O9)= zcm>3{vPcAm9s=)TN_>fRdwwF{X)V-MI_?Lt!l7H*n)bwgvt%%>a2nC3r(?_bOW5B` zZM8d)732`q!z_ifQpRw2{uQ2qEFt{dO;*4>VMy<-+d>B#c98nXlcJFU*J0t1a+Es) z2bNA7HjUCjOrwR>%AVRS;E##7Vyis^^OzoOCO%uMH;Q{s!a{MMmXg6vn4D}s>#;*D z9Zz`a>B~+!q1G+Ruu-iiNPb8I?2z0c^(<))8%RtdHF@L7N9p79uB1_8#!_oN&iRA8 zX=KfI8n1zmIwHi8)7&{hmYDUiM9>>xB50v3R2xFr#9fxXo^Cw(>)bg?y5g7fGFI<) zR}LLIB=Q=w)Q>ZVFaiAXm%l9H2lBSKu-cg=ean|eJdRn~#{s63jTcyQF7{CF=tBRJeHykyo%u-_`m72i;n#7o7i< zVL)TJZZ#d?!{LB#-`D!~Z~3I7tOfUESsYDc*_gl*Qv5a6&@Pq=5-qW~&(F+rSoBhE zXK`43HUIkkM*hxa_~o}w4g~{nN3tk-SgmSmwp6y0&PaoP{{QMs3RP@&Jet$sx8hai zI^1{9?B|fj?Cyg{@AleP=)L{F5JZqWu=lXhNv(6tfs!;Z@Rr}=KO_jDj@W{ehc8Le zD)ozC>aiU!Iyb`=XY=DTyHE9%`Yp>5B?7%d;Fu3T1iJlH;lP}6B?vO;hw7E3Z5$Jj zRjoOr&V@4u>;_ro6(ejWf=q8j-6Y5$51~17Xw2O2(1w59+~I^0H+JMJ3`5w+98M}a zYEKH=QCVS}SaSLoA%yIZGE{AOuB&4R9!#1un=*?!Zf_jamkDYY#}t#QL54eY-94F% zY;&R^z%N9{ycT-8QyJ~vz0H0IH9+1pgqz_PA=73{7~;Ay+4RF_o}gdVwhHg#xkcGD zby6W^=0xmRnLdf@08&MNP^SsD&Uk&ByOOTlEISEdb+RC!s?WnCL+P$PV*MN ze@Sd_0XbDudmMIr#jyKS?P=EAth4kL4Qr`ISLh-H1Ns`?xyz6&rom|jzYjm6=eeIn zYnf^4>SO5R3ahj?Tep7=28A2*&PjJ6dd*^x#Qy=IFbto;uix{;w(u|P*ME*Qp;OS$ zs;TB`l>bi2&=27Zz8N>dOHw#|!cgoSvblOGeSG+d7!eF0 z>~;_tMficjS7?6=kJ9QtOmFOjV>ccGlZLTb=^*7}d*TVi_D-xSZmC*NStYZ@G%QxPAcXaMmL=Hd1&}GkQ?rrMA+d8J z)f@+Z=1d}GAcVVD{5WO1z#hoOXM72^i<4qwavtN_ov(tRCMr}MX@!)QKM8q{+k@0Y z1JPQuxm}f| zqT)0seP!ARnqJuer%D@5$jzY9nQ5R6k(U{qd$^XMI>!5z&1O;_NM;7q!$Xk>@-DG7 zkZlh4?%hjlhlu!$^w2{O2}vMJ|2VV^lR>s0WFlBrRwi;JvrQt~G7dyZDH$~UZ2hSt zyfqC62@Byf>UvH&KFEaA%>pbJ*`9ImoMyVa{a7n597^0kmEqV)%}|Y)d==VrJN%0{ ztFjwyJWyc>nK0h8F_hhn@G;mHirSGDih;syDi3eK=tumDkskIKDRK1RvE$2Km+We} z|Jjm%sRgz@78?@k8MHWleJZ}|W{_&(^}FH7UntNX#)V@GvQ&`mb`oyM{oEkPI6~AM z7J;zGz@wQnq@=vyjQ|9Gmtm)?tjlQUL-2t~`8MQ$5`jTR;F7y`wXA%2+ItXDjK=e; z{T_xJA;@6Ez7;Vt$kQqqcNvzgN+5$QX{+B0f{1In45{SU!9zhEHvS3X|c}aN4<{THJ0oEnd7>$8HR@3UAn56;~s zsoa!BvC%Mi8c#3!GJSCH0VMABAV4+WxKqDNtU_|xhKU%0Hh2!Fy5QUh;dp(b+vp40 zGTL4tZ3I&du^jI>BA^<^n}(u%22+T=(1!et)VO~Qg=RL9)sZD;mp$TaL9~SJU7U?x z&{Iu~2Ua5^NHLX6|AJ`C&LqXtzX)kzDeYPFGYZ9dC--JoS=BpY##bo4@O0sz!hKDU zyM}!$;hFq@WQG&f%skhO;b#cD#mIIdSx9QOzu0xNrnv?;s&lE5K35h32SgPi50;f@Jo%+$CT-7lTH!a1lH|Sn(9$e&z>ef8rp~*|0&B@PvgMV|XX#R|rfNHzh9)_b5 z`XTsrYs*`W-8i8{d-U(K;yemhEZeg_herH|syLYWe!hPrCidnqGZPE0KzybwdSl1E z2pH|<7pIgKCW6_nF?894M`={fJpAggCrZVJmgn}+y=WkVWk-5b@2~AzQjO~6b{tMkN!QCOayF0-pxVyW{A?vL5?X}MzIG0=u zZ&h`5byaos^Bm~jBvOXqd`8c*NEG@bKKj$@y@NXyt-NK20hU{Ao%ul7nFkub>d)nn zRtMqJsD@KO&evb9mXb0{ex#rhcGD?waCRJUmoBi=dXkLNJ)wD6KXDo1izrp0{MyP~ zkTLuEpil&|#Ia(*Kyg#9L}6k)xKRsiZz&GCW&DNFg(XZIf@c9xL0Ow+ZnYVfoUg20 z(f4rjA-Zp}`AevXruQY`c7618xhh`Ug+#RH8L8fb<$Gw%eGTsA#*G3%Fqz8(UDet< z!=gcuniV2GaC}mTR)uWorfml`6m*!FANM45kD@ZM`NC_!?Yip59r=gM)5E}u$CFXr z)>pIW#1QF1LVa}f$2;o%x%TY0N0(=U2VDv~D_CyV`Z_a^`PKB$x%-fC)W-RvD^2S= zd_6ArkZ`vL`R-PB52J)B+1`KXA?3**o)xe{6%u^oh+RH#>~K+ zG^B82K0p>W*EnW~6tmx-%D>88ykl^DhKvkg(09tPfE)2Z0x&2_2TFRaJvAXD%rwPp zxKj}Esl?Q&*RPN(4fl1>+DojMBTe5Xb}}!osd0B z{FcgVTbpaGQvMTw%n9>%bNSnq_6Q|&xP*mV3dV|{%m#NV7-djpVZgfuL1G}G=z$3%tmJhw< zTbX1saKkv2g)Ny%L;7Qzd~8@NPr5|o7u>Q2MPKIrc3gPgGE$|~^d=`JT+rd&?R0gc zQTZG)5grdyL)`p$!fo0B8Mx~2ywUJSwn55+q!xN_FSMr#t_SKSiW7~vIM6PQ#415@ zFR#0^1gmvQ%miObih^~awQQ6g(4FuKM7Lu=H8Feq9lhxC+t*5bVD4JFn4uR*a1 zr+}FbO-d8;6P;p>W52(42Wc(lYforhKa<*=_{u+tkfq*Ix;Zff{VcN2-MZanBf5@R zZA^V;2oV3C%6NWx-7t0@6eDq#8 z@eSM&WAPY)V8>w`#j(K}^sN}Nq4lVsZq5LdCv^(4TagRCTQub!?-MQizsQ4xgfE!=%(hYSnZtd&r-)rrVFDG5)Dy%rf&kf>YECtP0aMhp=z6*p~| z!;G|&$aVp-30*8@^b5}zc5ro#EqeV&LJY`8UMDQw%2VM7YZI(5BhoIyDNref*C-p-MvDGb>IQG(B|3^$1$u?$Z z^0JnC<*_-?$qvOo*kxfgm(?GS&CQdIXk(r7*ix>4AjV}DS8GF&_x|oX;awf<%NzPM z-+Wj=_DyEN6Y>E5QU7%Kn#!Nx)%oyZv*857r214~Dgn{jQ{H*r&jbqyja0r0pu^a{#)TKPJbC-1; zSH2?f2b~TOW2YkD$(8m6qS!SVoz8KQYH>inkC9evw$Uc$UyX1D80aoR zi9Bk!r1$%-gU7LAnt;3RjJ^~B;=`?)>~;ZqL&V1vG~`3n#&u>Thew9(VUi$iSK|_L zJ%QO%4;1$(y=>4Gg0SC}c2O^ys><@3wKi1VZbtMGFam|I{^9cyht_O zj@7>gplOX>JqSTBF&xwC9s`L+{=pE}^oSJxGNgY)Xylcze&RVys#sdG%cZ-~s&DP| zr9u#EhUxK=(uD)#xv8ACEXYLw^v#zo7=Dgxj<;a}rKA6aR{MlSYCX8Ns^!P?uMWsl z69zl|<3Id!sH38>(vD>HoA*m=`jPr&!g4&LK)Ew%KoSH;3E&T@9ffn@B8-1N7@{Hs zfGQV+MXN#a!Y~jZ5ptuV_13EOLiMbtr}wUqX&!Z3p^0=tknx(OZ;Csc>*+Gj^qAL) zM-O}v38pyy)6w|D@NQasu=n%9?3PD^s>65Lu8(j6x`hFwp>BEoDg?Krt`+lFi-AXl zh2)pzQ0m9@$3h3kxKxS(-DIP{?|5aC4cwTkrEo%F>Y9$ z)%!pL(~%|abBP$~NhmkMFL@qo;hXYAAslHQL@k)T4!wJ)r zT^7m~)>*K-8!?Prsg#v$qJG4}4|JtD8(OBLA0A=F**-L|aQ;wr-e77Y3LvET`yaJd zNsR1+K>Vb;V6u{=MPUIpy+0{RGDhGsa))w1EKxDM=sORwI>-nbWiwud8c;g&NEM$M zMvN@bZj{XdWt-$+S(*&1GkFt0)+agSs2f(mM^`(ZB**k-tIPK@Tvz#W-pDIUzv%Yc zuyUV2Yh%c5b$>jU?{3gv9R;TSZ?sZ4K|R)}Y{&8;noYTQ)_8-);((F8#IpxBKsH&^ zBgzCuIgFg)W0;@}0K^Qm!HUA>m;CZUa6co)&+ExE(GO6P1LO`w*SMYKYO8p&=)cmM zkasPt5D`nlMUk3a#mz#OO=xxJ>Y|UBl=|{b>~gO##`IjnsSZ8amS%-!py5@`VQ&>A ze~&b`#r5=8rJl#+%}uczOgUhc^K!&cSt^6|qep@m{L4S+6%8>WX=gEGPP8t1whEGONh-Z|GNM-D?CO zY(m5wQJ@&i0hTSh8>cmuFq#MY|WprnzVv^~#S6;v@9EIbkl!e#C>NMtqKb3^Z zpw8l~r(-HRpOoy0q^R3lfAK(VjEjoZE_D|A*)Jfg#XMS4kED9%;J$E`DU;u)8fEtN zIJaeOrnTn{3p04tuK*g@?dS26)wlj0wpX*@6M5Lt7dj1c;tzZ>3%AtF6`JktWp$n+ zu+gsNga^r�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 KE>bUC|My>ZYOpx~ literal 0 HcmV?d00001 diff --git a/docs/gateway-protocol.md b/docs/gateway-protocol.md new file mode 100644 index 0000000000..8855d3d0d0 --- /dev/null +++ b/docs/gateway-protocol.md @@ -0,0 +1,276 @@ +# Protocol Documentation + + +## Table of Contents + +- [github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1/generated.proto](#github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1/generated.proto) + - [EventProtocol](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.EventProtocol) + - [Gateway](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.Gateway) + - [GatewayList](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.GatewayList) + - [GatewayNotificationWatcher](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.GatewayNotificationWatcher) + - [GatewaySpec](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.GatewaySpec) + - [GatewayStatus](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.GatewayStatus) + - [GatewayStatus.NodesEntry](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.GatewayStatus.NodesEntry) + - [Http](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.Http) + - [Nats](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.Nats) + - [NodeStatus](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.NodeStatus) + - [NotificationWatchers](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.NotificationWatchers) + - [SensorNotificationWatcher](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.SensorNotificationWatcher) + + + + + +- [Scalar Value Types](#scalar-value-types) + + + + +

Top

+ +## github.com/argoproj/argo-events/pkg/apis/gateway/v1alpha1/generated.proto + + + + + +### EventProtocol +Dispatch protocol contains configuration necessary to dispatch an event to sensor over different communication protocols + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| type | [string](#string) | optional | | +| http | [Http](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.Http) | optional | | +| nats | [Nats](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.Nats) | optional | | + + + + + + + + +### Gateway +Gateway is the definition of a gateway resource ++genclient ++k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object ++k8s:openapi-gen=true + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| metadata | [k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta](#k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta) | optional | | +| status | [GatewayStatus](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.GatewayStatus) | optional | | +| spec | [GatewaySpec](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.GatewaySpec) | optional | | + + + + + + + + +### GatewayList +GatewayList is the list of Gateway resources ++k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| metadata | [k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta](#k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta) | optional | | +| items | [Gateway](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.Gateway) | repeated | | + + + + + + + + +### GatewayNotificationWatcher +GatewayNotificationWatcher is the gateway interested in listening to notifications from this gateway + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | optional | Name is the gateway name | +| port | [string](#string) | optional | Port is http server port on which gateway is running | +| endpoint | [string](#string) | optional | Endpoint is REST API endpoint to post event to. Events are sent using HTTP POST method to this endpoint. | + + + + + + + + +### GatewaySpec +GatewaySpec represents gateway specifications + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| deploySpec | [k8s.io.api.core.v1.Pod](#k8s.io.api.core.v1.Pod) | optional | DeploySpec is the pod specification for the gateway Refer https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.11/#pod-v1-core | +| configmap | [string](#string) | optional | ConfigMap is name of the configmap for gateway. This configmap contains event sources. | +| type | [string](#string) | optional | Type is the type of gateway. Used as metadata. | +| eventVersion | [string](#string) | optional | Version is used for marking event version | +| serviceSpec | [k8s.io.api.core.v1.Service](#k8s.io.api.core.v1.Service) | optional | ServiceSpec is the specifications of the service to expose the gateway Refer https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.11/#service-v1-core | +| watchers | [NotificationWatchers](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.NotificationWatchers) | optional | Watchers are components which are interested listening to notifications from this gateway These only need to be specified when gateway dispatch mechanism is through HTTP POST notifications. In future, support for NATS, KAFKA will be added as a means to dispatch notifications in which case specifying watchers would be unnecessary. | +| processorPort | [string](#string) | optional | Port on which the gateway event source processor is running on. | +| eventProtocol | [EventProtocol](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.EventProtocol) | optional | EventProtocol is the underlying protocol used to send events from gateway to watchers(components interested in listening to event from this gateway) | + + + + + + + + +### GatewayStatus +GatewayStatus contains information about the status of a gateway. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| phase | [string](#string) | optional | Phase is the high-level summary of the gateway | +| startedAt | [k8s.io.apimachinery.pkg.apis.meta.v1.Time](#k8s.io.apimachinery.pkg.apis.meta.v1.Time) | optional | StartedAt is the time at which this gateway was initiated | +| message | [string](#string) | optional | Message is a human readable string indicating details about a gateway in its phase | +| nodes | [GatewayStatus.NodesEntry](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.GatewayStatus.NodesEntry) | repeated | Nodes is a mapping between a node ID and the node's status it records the states for the configurations of gateway. | + + + + + + + + +### GatewayStatus.NodesEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | optional | | +| value | [NodeStatus](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.NodeStatus) | optional | | + + + + + + + + +### Http + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| port | [string](#string) | optional | | + + + + + + + + +### Nats + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| url | [string](#string) | optional | | +| type | [string](#string) | optional | | +| clientId | [string](#string) | optional | | +| clusterId | [string](#string) | optional | | + + + + + + + + +### NodeStatus +NodeStatus describes the status for an individual node in the gateway configurations. +A single node can represent one configuration. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| id | [string](#string) | optional | ID is a unique identifier of a node within a sensor It is a hash of the node name | +| name | [string](#string) | optional | Name is a unique name in the node tree used to generate the node ID | +| displayName | [string](#string) | optional | DisplayName is the human readable representation of the node | +| phase | [string](#string) | optional | Phase of the node | +| startedAt | [k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime](#k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime) | optional | StartedAt is the time at which this node started +k8s:openapi-gen=false | +| message | [string](#string) | optional | Message store data or something to save for configuration | +| updateTime | [k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime](#k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime) | optional | UpdateTime is the time when node(gateway configuration) was updated | + + + + + + + + +### NotificationWatchers +NotificationWatchers are components which are interested listening to notifications from this gateway + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| gateways | [GatewayNotificationWatcher](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.GatewayNotificationWatcher) | repeated | Gateways is the list of gateways interested in listening to notifications from this gateway | +| sensors | [SensorNotificationWatcher](#github.com.argoproj.argo_events.pkg.apis.gateway.v1alpha1.SensorNotificationWatcher) | repeated | Sensors is the list of sensors interested in listening to notifications from this gateway | + + + + + + + + +### SensorNotificationWatcher +SensorNotificationWatcher is the sensor interested in listening to notifications from this gateway + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | optional | Name is name of the sensor | + + + + + + + + + + + + + + + +## Scalar Value Types + +| .proto Type | Notes | C++ Type | Java Type | Python Type | +| ----------- | ----- | -------- | --------- | ----------- | +| double | | double | double | float | +| float | | float | float | float | +| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | +| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | +| uint32 | Uses variable-length encoding. | uint32 | int | int/long | +| uint64 | Uses variable-length encoding. | uint64 | long | int/long | +| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | +| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | +| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | +| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | +| sfixed32 | Always four bytes. | int32 | int | int | +| sfixed64 | Always eight bytes. | int64 | long | int/long | +| bool | | bool | boolean | boolean | +| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | +| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | + diff --git a/docs/sensor-protocol.md b/docs/sensor-protocol.md new file mode 100644 index 0000000000..f0fd74dbb2 --- /dev/null +++ b/docs/sensor-protocol.md @@ -0,0 +1,519 @@ +# Protocol Documentation + + +## Table of Contents + +- [github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1/generated.proto](#github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1/generated.proto) + - [ArtifactLocation](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.ArtifactLocation) + - [ConfigmapArtifact](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.ConfigmapArtifact) + - [Data](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.Data) + - [DataFilter](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.DataFilter) + - [EventDependency](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.EventDependency) + - [EventDependencyFilter](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.EventDependencyFilter) + - [EventProtocol](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.EventProtocol) + - [FileArtifact](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.FileArtifact) + - [GroupVersionKind](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.GroupVersionKind) + - [Http](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.Http) + - [Nats](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.Nats) + - [NodeStatus](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.NodeStatus) + - [ResourceObject](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.ResourceObject) + - [ResourceObject.LabelsEntry](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.ResourceObject.LabelsEntry) + - [ResourceParameter](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.ResourceParameter) + - [ResourceParameterSource](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.ResourceParameterSource) + - [RetryStrategy](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.RetryStrategy) + - [Sensor](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.Sensor) + - [SensorList](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.SensorList) + - [SensorSpec](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.SensorSpec) + - [SensorStatus](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.SensorStatus) + - [SensorStatus.NodesEntry](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.SensorStatus.NodesEntry) + - [TimeFilter](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.TimeFilter) + - [Trigger](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.Trigger) + - [URLArtifact](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.URLArtifact) + + + + + +- [Scalar Value Types](#scalar-value-types) + + + + +

Top

+ +## github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1/generated.proto + + + + + +### ArtifactLocation +ArtifactLocation describes the source location for an external artifact + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| s3 | [github.com.argoproj.argo_events.pkg.apis.common.S3Artifact](#github.com.argoproj.argo_events.pkg.apis.common.S3Artifact) | optional | | +| inline | [string](#string) | optional | | +| file | [FileArtifact](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.FileArtifact) | optional | | +| url | [URLArtifact](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.URLArtifact) | optional | | +| configmap | [ConfigmapArtifact](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.ConfigmapArtifact) | optional | | + + + + + + + + +### ConfigmapArtifact +ConfigmapArtifact contains information about artifact in k8 configmap + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | optional | Name of the configmap | +| namespace | [string](#string) | optional | Namespace where configmap is deployed | +| key | [string](#string) | optional | Key within configmap data which contains trigger resource definition | + + + + + + + + +### Data + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| filters | [DataFilter](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.DataFilter) | repeated | filter constraints | + + + + + + + + +### DataFilter +DataFilter describes constraints and filters for event data +Regular Expressions are purposefully not a feature as they are overkill for our uses here +See Rob Pike's Post: https://commandcenter.blogspot.com/2011/08/regular-expressions-in-lexing-and.html + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| path | [string](#string) | optional | Path is the JSONPath of the event's (JSON decoded) data key Path is a series of keys separated by a dot. A key may contain wildcard characters '*' and '?'. To access an array value use the index as the key. The dot and wildcard characters can be escaped with '\\'. See https://github.com/tidwall/gjson#path-syntax for more information on how to use this. | +| type | [string](#string) | optional | Type contains the JSON type of the data | +| value | [string](#string) | optional | Value is the expected string value for this key Booleans are pased using strconv.ParseBool() Numbers are parsed using as float64 using strconv.ParseFloat() Strings are taken as is Nils this value is ignored | + + + + + + + + +### EventDependency +EventDependency describes a dependency + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | optional | Name is a unique name of this dependency | +| deadline | [int64](#int64) | optional | Deadline is the duration in seconds after the StartedAt time of the sensor after which this event is terminated. Note: this functionality is not yet respected, but it's theoretical behavior is as follows: This trumps the recurrence patterns of calendar events and allows any event to have a strict defined life. After the deadline is reached and this event has not in a Resolved state, this event is marked as Failed and proper escalations should proceed. | +| filters | [EventDependencyFilter](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.EventDependencyFilter) | optional | Filters and rules governing tolerations of success and constraints on the context and data of an event | +| connected | [bool](#bool) | optional | Connected tells if subscription is already setup in case of nats protocol. | + + + + + + + + +### EventDependencyFilter +EventDependencyFilter defines filters and constraints for a event. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | optional | Name is the name of event filter | +| time | [TimeFilter](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.TimeFilter) | optional | Time filter on the event with escalation | +| context | [github.com.argoproj.argo_events.pkg.apis.common.EventContext](#github.com.argoproj.argo_events.pkg.apis.common.EventContext) | optional | Context filter constraints with escalation | +| data | [Data](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.Data) | optional | Data filter constraints with escalation | + + + + + + + + +### EventProtocol +EventProtocol contains configuration necessary to receieve an event from gateway over different communication protocols + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| type | [string](#string) | optional | Type defines the type of protocol over which events will be receieved | +| http | [Http](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.Http) | optional | Http contains the information required to setup a http server and listen to incoming events | +| nats | [Nats](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.Nats) | optional | Nats contains the information required to connect to nats server and get subscriptions | + + + + + + + + +### FileArtifact +FileArtifact contains information about an artifact in a filesystem + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| path | [string](#string) | optional | | + + + + + + + + +### GroupVersionKind +GroupVersionKind unambiguously identifies a kind. It doesn't anonymously include GroupVersion +to avoid automatic coercion. It doesn't use a GroupVersion to avoid custom marshalling. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| group | [string](#string) | optional | | +| version | [string](#string) | optional | | +| kind | [string](#string) | optional | | + + + + + + + + +### Http +Http contains the information required to setup a http server and listen to incoming events + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| port | [string](#string) | optional | Port on which server will run | + + + + + + + + +### Nats +Nats contains the information required to connect to nats server and get subscriptions + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| url | [string](#string) | optional | URL is nats server/service URL | +| startWithLastReceived | [bool](#bool) | optional | Subscribe starting with most recently published value. Refer https://github.com/nats-io/go-nats-streaming | +| deliverAllAvailable | [bool](#bool) | optional | Receive all stored values in order. | +| startAtSequence | [string](#string) | optional | Receive messages starting at a specific sequence number | +| startAtTime | [string](#string) | optional | Subscribe starting at a specific time | +| startAtTimeDelta | [string](#string) | optional | Subscribe starting a specific amount of time in the past (e.g. 30 seconds ago) | +| durable | [bool](#bool) | optional | Durable subscriptions allow clients to assign a durable name to a subscription when it is created | +| clusterId | [string](#string) | optional | The NATS Streaming cluster ID | +| clientId | [string](#string) | optional | The NATS Streaming cluster ID | +| type | [string](#string) | optional | Type of the connection. either standard or streaming | + + + + + + + + +### NodeStatus +NodeStatus describes the status for an individual node in the sensor's FSM. +A single node can represent the status for event or a trigger. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| id | [string](#string) | optional | ID is a unique identifier of a node within a sensor It is a hash of the node name | +| name | [string](#string) | optional | Name is a unique name in the node tree used to generate the node ID | +| displayName | [string](#string) | optional | DisplayName is the human readable representation of the node | +| type | [string](#string) | optional | Type is the type of the node | +| phase | [string](#string) | optional | Phase of the node | +| startedAt | [k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime](#k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime) | optional | StartedAt is the time at which this node started | +| completedAt | [k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime](#k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime) | optional | CompletedAt is the time at which this node completed | +| message | [string](#string) | optional | store data or something to save for event notifications or trigger events | +| event | [github.com.argoproj.argo_events.pkg.apis.common.Event](#github.com.argoproj.argo_events.pkg.apis.common.Event) | optional | Event stores the last seen event for this node | + + + + + + + + +### ResourceObject +ResourceObject is the resource object to create on kubernetes + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| groupVersionKind | [GroupVersionKind](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.GroupVersionKind) | optional | The unambiguous kind of this object - used in order to retrieve the appropriate kubernetes api client for this resource | +| namespace | [string](#string) | optional | Namespace in which to create this object defaults to the service account namespace | +| source | [ArtifactLocation](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.ArtifactLocation) | optional | Source of the K8 resource file(s) | +| labels | [ResourceObject.LabelsEntry](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.ResourceObject.LabelsEntry) | repeated | Map of string keys and values that can be used to organize and categorize (scope and select) objects. This overrides any labels in the unstructured object with the same key. | +| parameters | [ResourceParameter](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.ResourceParameter) | repeated | Parameters is the list of resource parameters to pass in the object | + + + + + + + + +### ResourceObject.LabelsEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | optional | | +| value | [string](#string) | optional | | + + + + + + + + +### ResourceParameter +ResourceParameter indicates a passed parameter to a service template + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| src | [ResourceParameterSource](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.ResourceParameterSource) | optional | Src contains a source reference to the value of the resource parameter from a event event | +| dest | [string](#string) | optional | Dest is the JSONPath of a resource key. A path is a series of keys separated by a dot. The colon character can be escaped with '.' The -1 key can be used to append a value to an existing array. See https://github.com/tidwall/sjson#path-syntax for more information about how this is used. | + + + + + + + + +### ResourceParameterSource +ResourceParameterSource defines the source for a resource parameter from a event event + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| event | [string](#string) | optional | Event is the name of the event for which to retrieve this event | +| path | [string](#string) | optional | Path is the JSONPath of the event's (JSON decoded) data key Path is a series of keys separated by a dot. A key may contain wildcard characters '*' and '?'. To access an array value use the index as the key. The dot and wildcard characters can be escaped with '\\'. See https://github.com/tidwall/gjson#path-syntax for more information on how to use this. | +| value | [string](#string) | optional | Value is the default literal value to use for this parameter source This is only used if the path is invalid. If the path is invalid and this is not defined, this param source will produce an error. | + + + + + + + + +### RetryStrategy +RetryStrategy represents a strategy for retrying operations +TODO: implement me + + + + + + + + +### Sensor +Sensor is the definition of a sensor resource ++genclient ++genclient:noStatus ++k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object ++k8s:openapi-gen=true + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| metadata | [k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta](#k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta) | optional | | +| spec | [SensorSpec](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.SensorSpec) | optional | | +| status | [SensorStatus](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.SensorStatus) | optional | | + + + + + + + + +### SensorList +SensorList is the list of Sensor resources ++k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| metadata | [k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta](#k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta) | optional | | +| items | [Sensor](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.Sensor) | repeated | | + + + + + + + + +### SensorSpec +SensorSpec represents desired sensor state + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| dependencies | [EventDependency](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.EventDependency) | repeated | Dependencies is a list of the events that this sensor is dependent on. | +| triggers | [Trigger](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.Trigger) | repeated | Triggers is a list of the things that this sensor evokes. These are the outputs from this sensor. | +| deploySpec | [k8s.io.api.core.v1.PodSpec](#k8s.io.api.core.v1.PodSpec) | optional | DeploySpec contains sensor pod specification. For more information, read https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.11/#pod-v1-core | +| eventProtocol | [EventProtocol](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.EventProtocol) | optional | EventProtocol is the protocol through which sensor receives events from gateway | + + + + + + + + +### SensorStatus +SensorStatus contains information about the status of a sensor. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| phase | [string](#string) | optional | Phase is the high-level summary of the sensor | +| startedAt | [k8s.io.apimachinery.pkg.apis.meta.v1.Time](#k8s.io.apimachinery.pkg.apis.meta.v1.Time) | optional | StartedAt is the time at which this sensor was initiated | +| completedAt | [k8s.io.apimachinery.pkg.apis.meta.v1.Time](#k8s.io.apimachinery.pkg.apis.meta.v1.Time) | optional | CompletedAt is the time at which this sensor was completed | +| completionCount | [int32](#int32) | optional | CompletionCount is the count of sensor's successful runs. | +| message | [string](#string) | optional | Message is a human readable string indicating details about a sensor in its phase | +| nodes | [SensorStatus.NodesEntry](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.SensorStatus.NodesEntry) | repeated | Nodes is a mapping between a node ID and the node's status it records the states for the FSM of this sensor. | + + + + + + + + +### SensorStatus.NodesEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | optional | | +| value | [NodeStatus](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.NodeStatus) | optional | | + + + + + + + + +### TimeFilter +TimeFilter describes a window in time. +Filters out event events that occur outside the time limits. +In other words, only events that occur after Start and before Stop +will pass this filter. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| start | [string](#string) | optional | Start is the beginning of a time window. Before this time, events for this event are ignored and format is hh:mm:ss | +| stop | [string](#string) | optional | StopPattern is the end of a time window. After this time, events for this event are ignored and format is hh:mm:ss | + + + + + + + + +### Trigger +Trigger is an action taken, output produced, an event created, a message sent + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | optional | Name is a unique name of the action to take | +| resource | [ResourceObject](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.ResourceObject) | optional | Resource describes the resource that will be created by this action | +| message | [string](#string) | optional | Message describes a message that will be sent on a queue | +| replyStrategy | [RetryStrategy](#github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.RetryStrategy) | optional | RetryStrategy is the strategy to retry a trigger if it fails | + + + + + + + + +### URLArtifact +URLArtifact contains information about an artifact at an http endpoint. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| path | [string](#string) | optional | | +| verifyCert | [bool](#bool) | optional | | + + + + + + + + + + + + + + + +## Scalar Value Types + +| .proto Type | Notes | C++ Type | Java Type | Python Type | +| ----------- | ----- | -------- | --------- | ----------- | +| double | | double | double | float | +| float | | float | float | float | +| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | +| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | +| uint32 | Uses variable-length encoding. | uint32 | int | int/long | +| uint64 | Uses variable-length encoding. | uint64 | long | int/long | +| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | +| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | +| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | +| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | +| sfixed32 | Always four bytes. | int32 | int | int | +| sfixed64 | Always eight bytes. | int64 | long | int/long | +| bool | | bool | boolean | boolean | +| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | +| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | + From 12335e482216281114f25c3011641a92c78012f4 Mon Sep 17 00:00:00 2001 From: vpage Date: Tue, 29 Jan 2019 14:35:27 -0500 Subject: [PATCH 18/22] Updating docs for v0.7 --- README.md | 26 ++- ROADMAP.md | 2 - docs/index.md | 31 --- docs/quickstart.md | 8 +- docs/tutorial.md | 216 ------------------ examples/gateways/artifact-nats-standard.yaml | 2 +- examples/gateways/calendar.yaml | 2 +- examples/gateways/file.yaml | 2 +- examples/gateways/github.yaml | 2 +- examples/gateways/storage-grid.yaml | 2 +- examples/gateways/webhook-nats-streaming.yaml | 2 +- gateways/core/artifact/install.md | 56 +++++ gateways/core/calendar/install.md | 44 ++++ gateways/core/file/install.md | 46 ++++ gateways/core/resource/install.md | 60 +++++ gateways/core/stream/amqp/install.md | 50 ++++ gateways/core/stream/kafka/install.md | 50 ++++ gateways/core/stream/mqtt/install.md | 46 ++++ gateways/core/stream/nats/install.md | 45 ++++ gateways/core/webhook/install.md | 54 +++++ 20 files changed, 483 insertions(+), 263 deletions(-) delete mode 100644 docs/index.md delete mode 100644 docs/tutorial.md create mode 100644 gateways/core/artifact/install.md create mode 100644 gateways/core/calendar/install.md create mode 100644 gateways/core/file/install.md create mode 100644 gateways/core/resource/install.md create mode 100644 gateways/core/stream/amqp/install.md create mode 100644 gateways/core/stream/kafka/install.md create mode 100644 gateways/core/stream/mqtt/install.md create mode 100644 gateways/core/stream/nats/install.md create mode 100644 gateways/core/webhook/install.md diff --git a/README.md b/README.md index ed76743be1..64dfec67b9 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,25 @@ Argo Events is an event-based dependency manager for Kubernetes. The core concep ## Getting Started [![asciicast](https://asciinema.org/a/207973.png)](https://asciinema.org/a/207973) -- [Installation](./docs/quickstart.md) -- [Guide](./docs/tutorial.md) -- [Want to contribute or develop/run locally?](./CONTRIBUTING.md) -- See where the project is headed in the [roadmap](./ROADMAP.md) +
+
+ +1. [Installation](./docs/quickstart.md) +2. [Sensor and gateway controllers](controllers-guide.md) +3. [Learn about gateways](gateway-guide.md) +4. [Learn about sensors](sensor-guide.md) +5. [Learn about triggers](trigger-guide.md) +6. [Install Gateways and Sensors]() + 1. [Webhook](gateways/core/webhook/install.md) + 2. [Artifact](gateways/core/artifact/install.md) + 3. [Calendar](gateways/core/calendar/install.md) + 4. [Resource](gateways/core/resource/install.md) + 5. [File](gateways/core/file/install.md) + 6. [Streams]() + 1. [NATS](gateways/core/stream/nats/install.md) + 2. [KAFKA](gateways/core/stream/kafka/install.md) + 3. [AMQP](gateways/core/stream/amqp/install.md) + 4. [MQTT](gateways/core/stream/mqtt/install.md) +7. [Write your own gateway](docs/custom-gateway.md) +8. [Want to contribute or develop/run locally?](./CONTRIBUTING.md) +9. See where the project is headed in the [roadmap](./ROADMAP.md) diff --git a/ROADMAP.md b/ROADMAP.md index 70c08b84fd..d226e8607b 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -2,8 +2,6 @@ ## Development Phase - E2E testing -- Add NATS Streaming as internal pub-sub system -- Add SNS & SQS gateway Support ## Idea Phase - Use [hashicorp/go-getter](https://github.com/hashicorp/go-getter) for the `ArtifactReader` interface. diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index 1002c19eb4..0000000000 --- a/docs/index.md +++ /dev/null @@ -1,31 +0,0 @@ -# Argo Events Documentation - -## Why Argo Events? -- Containers. Designed from the ground-up as Kubernetes-native. -- Extremely lightweight. All gateways, with exception of calendar based gateway, are event-driven, meaning there is no polling involved. -- Configurable. Configure gateways at runtime -- Extensible. Write custom gateways for any business use case in the language of your choice -- Scalability & Resilient. -- Simple or Complex dependencies. Manage everything from simple, linear, real-time dependencies to complex, multi-source batch job dependencies. - -## Basics -Argo Events is an open source event-based dependency manager for Kubernetes. The core concept of the project are - * `gateways` which are implemented as a Kubernetes-native Custom Resource Definition consumes events from event sources. - - * `sensors` which are implemented as a Kubernetes-native Custom Resource Definition define a set of dependencies - (inputs) and actions (outputs). - - -## Features -* Define gateway to support business-level logic for producing events. -* Define multiple dependencies from a variety of sources -* Trigger Kubernetes object creation after successful dependency resolution -* Trigger escalation after errors, or dependency constraint failures -* Build and manage a distributed, cross-team, event-driven architecture -* Easily leverage Kubernetes native APIs to monitor dependencies - -## Learn More -- [Quickstart](quickstart.md) -- [Gateways](gateway-guide.md) -- [Sensors](sensor-guide.md) -- [Triggers](trigger-guide.md) diff --git a/docs/quickstart.md b/docs/quickstart.md index 9e64d979ea..d8d7597315 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -39,12 +39,12 @@ Follow instructions from https://github.com/argoproj/argo/blob/master/demo.md ## 4. Create a webhook gateway ``` kubectl apply -n argo-events -f examples/gateways/webhook-gateway-configmap.yaml -kubectl apply -n argo-events -f examples/gateways/webhook.yaml +kubectl apply -n argo-events -f examples/gateways/webhook-http.yaml ``` ## 5. Create a webhook sensor ``` -kubectl apply -n argo-events -f examples/sensors/webhook.yaml +kubectl apply -n argo-events -f examples/sensors/webhook-http.yaml ``` ## 6. Trigger the webhook & corresponding Argo workflow @@ -52,13 +52,13 @@ Trigger the webhook via sending a http POST request to `/foo` endpoint. You can gateway configuration at run time as well. Note: the `WEBHOOK_SERVICE_URL` will differ based on the Kubernetes cluster. ``` -export WEBHOOK_SERVICE_URL=$(minikube service -n argo-events --url webhook-gateway-gateway-svc) +export WEBHOOK_SERVICE_URL=$(minikube service -n argo-events --url ) echo $WEBHOOK_SERVICE_URL curl -d '{"message":"this is my first webhook"}' -H "Content-Type: application/json" -X POST $WEBHOOK_SERVICE_URL/foo ``` Note: - * If you are facing an issue getting service url by running `minikube service -n argo-events --url webhook-gateway-gateway-svc`, you can use `kubectl port-forward` + * If you are facing an issue getting service url by running `minikube service -n argo-events --url `, you can use `kubectl port-forward` * Open another terminal window and enter `kubectl port-forward -n argo-events 9003:` * You can now use `localhost:9003` to query webhook gateway diff --git a/docs/tutorial.md b/docs/tutorial.md deleted file mode 100644 index a717db5c38..0000000000 --- a/docs/tutorial.md +++ /dev/null @@ -1,216 +0,0 @@ -# Guide - -1. [Sensor and gateway controllers](controllers-guide.md) -2. [Learn about gateways](gateway-guide.md) -3. [Learn about sensors](sensor-guide.md) -4. [Learn about triggers](trigger-guide.md) -5. [Core Gateways Event Sources](#core-gateways-event-sources) - 1. [Webhook](#webhook) - 2. [Artifact](#artifact) - 3. [Calendar](#calendar) - 4. [Resource](#resource) - 5. [Streams](#streams) -6. [Sensor filters](#sensor-filters) -7. [Write your own gateway](custom-gateway.md) - -## Core Gateways Event Sources -Event source name can be any valid string. - -### Webhook -Webhook gateway listens to incoming HTTP requests. - -```yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: webhook-gateway-configmap -data: - # each event source defines - - # the port for HTTP server - # endpoint to listen to - # acceptable http method - bar: |- - port: "12000" - endpoint: "/bar" - method: "POST" - foo: |- - port: "12000" - endpoint: "/foo" - method: "POST" -``` - -## Artifact -Artifact gateway listens to minio bucket notifications. -```yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: artifact-gateway-configmap -data: - input: |- - bucket: - name: input # name of the bucket we want to listen to - endpoint: minio-service.argo-events:9000 # minio service endpoint - event: s3:ObjectCreated:Put # type of event - filter: # filter on object name if any - prefix: "" - suffix: "" - insecure: true # type of minio server deployment - accessKey: - key: accesskey # key within below k8 secret whose corresponding value is name of the accessKey - name: artifacts-minio # k8 secret name that holds minio creds - secretKey: - key: secretkey # key within below k8 secret whose corresponding value is name of the secretKey - name: artifacts-minio # k8 secret name that holds minio creds -``` - -## Calendar -Calendar gateway either accepts `interval` and `cron schedules` as event source. -```yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: calendar-gateway-configmap -data: - interval: |- - interval: 10s # event is generated after every 10 seconds - schedule: |- - schedule: 30 * * * * # event is generated after 30 min past every hour -``` - -## Resource -Resource gateway can monitor any K8 resource and any CRD. -```yaml -apiVersion: v1 -kind: ConfigMap -metadata: - name: resource-gateway-configmap -data: - successWorkflow: |- - namespace: argo-events # namespace where wf is deloyef - group: "argoproj.io" # wf group - version: "v1alpha1" # wf version - kind: "Workflow" # object kind - filter: # filters can be applied on labels, annotations, creation time and name - labels: - workflows.argoproj.io/phase: Succeeded - name: "my-workflow" - failureWorkflow: |- - namespace: argo-events - group: "argoproj.io" - version: "v1alpha1" - kind: "Workflow" - filter: - prefix: scripts-bash - labels: - workflows.argoproj.io/phase: Failed -``` - -## Streams - * **NATS**: - ```yaml - apiVersion: v1 - kind: ConfigMap - metadata: - name: nats-gateway-configmap - data: - foo: |- - url: nats://nats.argo-events:4222 # nats service - subject: foo # subject to listen to - ``` - - * **KAFKA**: - ```yaml - apiVersion: v1 - kind: ConfigMap - metadata: - name: kafka-gateway-configmap - data: - foo: |- - url: kafka.argo-events:9092 # kafka service - topic: foo # topic name - partition: "0" # topic partition - bar: |- - url: kafka.argo-events:9092 - topic: bar - partition: "1" - ``` - - - * **MQTT**: - ```yaml - apiVersion: v1 - kind: ConfigMap - metadata: - name: mqtt-gateway-configmap - data: - foo: |- - url: tcp://mqtt.argo-events:1883 # mqtt service - topic: foo # topic to listen to - bar: |- - url: tcp://mqtt.argo-events:1883 - topic: bar - - ``` - - * **AMQP** - ```yaml - apiVersion: v1 - kind: ConfigMap - metadata: - name: amqp-gateway-configmap - data: - foo: |- - url: amqp://amqp.argo-events:5672 - exchangeName: foo - exchangeType: fanout - routingKey: fooK - bar: |- - url: amqp://amqp.argo-events:5672 - exchangeName: bar - exchangeType: fanout - routingKey: barK - ``` - -## Sensor Filters - Following are the types of the filter you can apply on signal/event payload, - - | Type | Description | - |----------|-------------------| - | Time | Filters the signal based on time constraints | - | EventContext | Filters metadata that provides circumstantial information about the signal. | - | Data | Describes constraints and filters for payload | - - ### Time Filter - ```yaml - filters: - time: - start: "2016-05-10T15:04:05Z07:00" - stop: "2020-01-02T15:04:05Z07:00" - ``` - - Example: - https://raw.githubusercontent.com/argoproj/argo-events/master/examples/sensors/time-filter-webhook.yaml - - ### EventContext Filter - ``` - filters: - context: - source: - host: amazon.com - contentType: application/json - ``` - - Example: - https://raw.githubusercontent.com/argoproj/argo-events/master/examples/sensors/context-filter-webhook.yaml - - ### Data filter - ``` - filters: - data: - - path: bucket - type: string - value: argo-workflow-input - ``` - Example: - https://raw.githubusercontent.com/argoproj/argo-events/master/examples/sensors/data-filter-webhook.yaml diff --git a/examples/gateways/artifact-nats-standard.yaml b/examples/gateways/artifact-nats-standard.yaml index 5483e407d5..94c9401cba 100644 --- a/examples/gateways/artifact-nats-standard.yaml +++ b/examples/gateways/artifact-nats-standard.yaml @@ -7,7 +7,7 @@ metadata: gateway-name: "artifact-gateway-nats-standard" spec: processorPort: "9330" - dispatchProtocol: + eventProtocol: type: "NATS" nats: url: "nats://example-nats.argo-events:4222" diff --git a/examples/gateways/calendar.yaml b/examples/gateways/calendar.yaml index 86a550a28e..e3bba9c54a 100644 --- a/examples/gateways/calendar.yaml +++ b/examples/gateways/calendar.yaml @@ -7,7 +7,7 @@ metadata: gateway-name: "calendar-gateway" spec: processorPort: "9330" - dispatchProtocol: + eventProtocol: type: "HTTP" http: port: "9300" diff --git a/examples/gateways/file.yaml b/examples/gateways/file.yaml index abbfbde7c2..5255523ea1 100644 --- a/examples/gateways/file.yaml +++ b/examples/gateways/file.yaml @@ -7,7 +7,7 @@ metadata: gateway-name: "file-gateway" spec: processorPort: "9330" - dispatchProtocol: + eventProtocol: type: "HTTP" http: port: "9300" diff --git a/examples/gateways/github.yaml b/examples/gateways/github.yaml index a24396d881..b47cc52a02 100644 --- a/examples/gateways/github.yaml +++ b/examples/gateways/github.yaml @@ -7,7 +7,7 @@ metadata: gateway-name: "github-gateway" spec: processorPort: "9330" - dispatchProtocol: + eventProtocol: type: "HTTP" http: port: "9300" diff --git a/examples/gateways/storage-grid.yaml b/examples/gateways/storage-grid.yaml index 32a64283ef..a643e1aca4 100644 --- a/examples/gateways/storage-grid.yaml +++ b/examples/gateways/storage-grid.yaml @@ -9,7 +9,7 @@ spec: configMap: "storage-grid-gateway-configmap" type: "storage_grid" processorPort: "9330" - dispatchProtocol: + eventProtocol: type: "HTTP" http: port: "9300" diff --git a/examples/gateways/webhook-nats-streaming.yaml b/examples/gateways/webhook-nats-streaming.yaml index f8b18dd4ba..02dfa527e7 100644 --- a/examples/gateways/webhook-nats-streaming.yaml +++ b/examples/gateways/webhook-nats-streaming.yaml @@ -9,7 +9,7 @@ spec: configMap: "webhook-gateway-configmap" type: "webhook" processorPort: "9330" - dispatchProtocol: + eventProtocol: type: "NATS" nats: url: "nats://example-nats.argo-events:4222" diff --git a/gateways/core/artifact/install.md b/gateways/core/artifact/install.md new file mode 100644 index 0000000000..1ba03cebdb --- /dev/null +++ b/gateways/core/artifact/install.md @@ -0,0 +1,56 @@ +# Artifact Gateway & Sensor + +Minio bucket notifications acts as event sources for artifact gateway. To setup minio, follow https://www.minio.io/kubernetes.html + +1. [Example event sources definition](#example-event-sources-definition) +2. [Install gateway](#install-gateway) +3. [Install sensor](#install-sensor) + +## Example event sources definition +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: artifact-gateway-configmap +data: + input: |- + bucket: + name: input # name of the bucket we want to listen to + endpoint: minio-service.argo-events:9000 # minio service endpoint + event: s3:ObjectCreated:Put # type of event + filter: # filter on object name if any + prefix: "" + suffix: "" + insecure: true # type of minio server deployment + accessKey: + key: accesskey # key within below k8 secret whose corresponding value is name of the accessKey + name: artifacts-minio # k8 secret name that holds minio creds + secretKey: + key: secretkey # key within below k8 secret whose corresponding value is name of the secretKey + name: artifacts-minio # k8 secret name that holds minio creds +``` + +```yaml +kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/gateways/artifact-gateway-configmap.yaml +``` + +## Install Gateway +Pre-requisite - create necessary buckets in Minio. +1. **Create gateway** + + ```yaml + kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/gateways/artifact-http.yaml + ``` + +2. **Check the status of the gateway** + + ```yaml + kubectl -n argo-events describe gateway artifact-gateway + ``` + + Make sure the gateway is in active state and all the event sources are in running state. + +## Install Sensor +```yaml +kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/sensors/artifact.yaml +``` diff --git a/gateways/core/calendar/install.md b/gateways/core/calendar/install.md new file mode 100644 index 0000000000..931e099fdb --- /dev/null +++ b/gateways/core/calendar/install.md @@ -0,0 +1,44 @@ +# Calendar Gateway & Sensor + +Intervals or cron schedules act as event sources for calendar gateway. + +1. [Example event sources definition](#example-event-sources-definition) +2. [Install gateway](#install-gateway) +3. [Install sensor](#install-sensor) + +## Example event sources definition +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: calendar-gateway-configmap +data: + interval: |- + interval: 10s # event is generated after every 10 seconds + schedule: |- + schedule: 30 * * * * # event is generated after 30 min past every hour +``` + +```yaml +kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/gateways/calendar-gateway-configmap.yaml +``` + +## Install gateway +1. **Create gateway** + + ```yaml + kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/gateways/calendar.yaml + ``` + +2. **Check the status of the gateway** + + ```yaml + kubectl -n argo-events describe gateway calendar-gateway + ``` + + Make sure the gateway is in active state and all the event sources are in running state. + +## Install Sensor +```yaml +kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/sensors/calendar.yaml +``` diff --git a/gateways/core/file/install.md b/gateways/core/file/install.md new file mode 100644 index 0000000000..424743b366 --- /dev/null +++ b/gateways/core/file/install.md @@ -0,0 +1,46 @@ +# File Gateway & Sensor + +File system serves as event source for file gateway + +1. [Example event sources definition](#example-event-sources-definition) +2. [Install gateway](#install-gateway) +3. [Install sensor](#install-sensor) + +## Example event sources definition +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: file-gateway-configmap +data: + bindir: |- # event source name can be any valid string + directory: "/bin/" # directory where file events are watched + type: CREATE # type of file event + path: x.txt # file to watch to +``` + +```yaml +kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/gateways/file-gateway-configmap.yaml +``` + +## Install gateway +Pre-requisite - The file system you want to watch must be mounted in gateway pod and the directory under which a file is to be watched must exist. + +1. **Create gateway** + + ```yaml + kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/gateways/file.yaml + ``` + +2. **Check the status of the gateway** + + ```yaml + kubectl -n argo-events describe gateway file-gateway + ``` + + Make sure the gateway is in active state and all the event sources are in running state. + +## Install Sensor +```yaml +kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/sensors/file.yaml +``` diff --git a/gateways/core/resource/install.md b/gateways/core/resource/install.md new file mode 100644 index 0000000000..94fed8d513 --- /dev/null +++ b/gateways/core/resource/install.md @@ -0,0 +1,60 @@ +# Resource Gateway & Sensor + +K8s resources act as event sources for Resource gateway + +1. [Example event sources definition](#example-event-sources-definition) +2. [Install gateway](#install-gateway) +3. [Install sensor](#install-sensor) + +## Example event sources definition +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: resource-gateway-configmap +data: + successWorkflow: |- + namespace: argo-events # namespace where wf is deloyef + group: "argoproj.io" # wf group + version: "v1alpha1" # wf version + kind: "Workflow" # object kind + filter: # filters can be applied on labels, annotations, creation time and name + labels: + workflows.argoproj.io/phase: Succeeded + name: "my-workflow" + failureWorkflow: |- + namespace: argo-events + group: "argoproj.io" + version: "v1alpha1" + kind: "Workflow" + filter: + prefix: scripts-bash + labels: + workflows.argoproj.io/phase: Failed +``` + +Create gateway event sources + +```yaml +kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/gateways/resource-gateway-configmap.yaml +``` + +## Install gateway +1. **Create gateway** + + ```yaml + kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/gateways/resource.yaml + ``` + +2. **Check the status of the gateway** + + ```yaml + kubectl -n argo-events describe gateway resource-gateway + ``` + + Make sure the gateway is in active state and all the event sources are in running state. + +## Install Sensor +```yaml +kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/sensors/resource.yaml +``` diff --git a/gateways/core/stream/amqp/install.md b/gateways/core/stream/amqp/install.md new file mode 100644 index 0000000000..9e56722dce --- /dev/null +++ b/gateways/core/stream/amqp/install.md @@ -0,0 +1,50 @@ +# AMQP Gateway & Sensor + +1. [Example event sources definition](#example-event-sources-definition) +2. [Install gateway](#install-gateway) +3. [Install sensor](#install-sensor) + +## Example event sources definition +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: amqp-gateway-configmap +data: + foo: |- + url: amqp://amqp.argo-events:5672 + exchangeName: foo + exchangeType: fanout + routingKey: fooK + bar: |- + url: amqp://amqp.argo-events:5672 + exchangeName: bar + exchangeType: fanout + routingKey: barK +``` + +Create gateway event sources + +```yaml +kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/gateways/amqp-gateway-configmap.yaml +``` + +## Install gateway +1. **Create gateway** + + ```yaml + kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/gateways/amqp.yaml + ``` + +2. **Check the status of the gateway** + + ```yaml + kubectl -n argo-events describe gateway amqp-gateway + ``` + + Make sure the gateway is in active state and all the event sources are in running state. + +## Install Sensor +```yaml +kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/sensors/amqp.yaml +``` diff --git a/gateways/core/stream/kafka/install.md b/gateways/core/stream/kafka/install.md new file mode 100644 index 0000000000..6f0d0462ab --- /dev/null +++ b/gateways/core/stream/kafka/install.md @@ -0,0 +1,50 @@ +# KAFKA Gateway & Sensor + +Kafka topics act as event sources for gateway + +1. [Example event sources definition](#example-event-sources-definition) +2. [Install gateway](#install-gateway) +3. [Install sensor](#install-sensor) + +## Example event sources definition +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: kafka-gateway-configmap +data: + foo: |- + url: kafka.argo-events:9092 # kafka service + topic: foo # topic name + partition: "0" # topic partition + bar: |- + url: kafka.argo-events:9092 + topic: bar + partition: "1" +``` + +Create gateway event sources + +```yaml +kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/gateways/kafka-gateway-configmap.yaml +``` + +## Install gateway +1. **Create gateway** + + ```yaml + kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/gateways/kafka.yaml + ``` + +2. **Check the status of the gateway** + + ```yaml + kubectl -n argo-events describe gateway kafka-gateway + ``` + + Make sure the gateway is in active state and all the event sources are in running state. + +## Install Sensor +```yaml +kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/sensors/kafka.yaml +``` diff --git a/gateways/core/stream/mqtt/install.md b/gateways/core/stream/mqtt/install.md new file mode 100644 index 0000000000..12ddb4af62 --- /dev/null +++ b/gateways/core/stream/mqtt/install.md @@ -0,0 +1,46 @@ +# MQTT Gateway & Sensor + +1. [Example event sources definition](#example-event-sources-definition) +2. [Install gateway](#install-gateway) +3. [Install sensor](#install-sensor) + +## Example event sources definition +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: mqtt-gateway-configmap +data: + foo: |- + url: tcp://mqtt.argo-events:1883 # mqtt service + topic: foo # topic to listen to + bar: |- + url: tcp://mqtt.argo-events:1883 + topic: bar +``` + +Create gateway event sources + +```yaml +kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/gateways/mqtt-gateway-configmap.yaml +``` + +## Install gateway +1. **Create gateway** + + ```yaml + kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/gateways/mqtt.yaml + ``` + +2. **Check the status of the gateway** + + ```yaml + kubectl -n argo-events describe gateway mqtt-gateway + ``` + + Make sure the gateway is in active state and all the event sources are in running state. + +## Install Sensor +```yaml +kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/sensors/mqtt.yaml +``` diff --git a/gateways/core/stream/nats/install.md b/gateways/core/stream/nats/install.md new file mode 100644 index 0000000000..ab6cb9c3f1 --- /dev/null +++ b/gateways/core/stream/nats/install.md @@ -0,0 +1,45 @@ +# NATS Gateway & Sensor + +NATS subjects act as event sources for gateway + +1. [Example event sources definition](#example-event-sources-definition) +2. [Install gateway](#install-gateway) +3. [Install sensor](#install-sensor) + +## Example event sources definition +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: nats-gateway-configmap +data: + foo: |- + url: nats://nats.argo-events:4222 # nats service + subject: foo # subject to listen to +``` + +Create gateway event sources + +```yaml +kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/gateways/nats-gateway-configmap.yaml +``` + +## Install gateway +1. **Create gateway** + + ```yaml + kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/gateways/nats.yaml + ``` + +2. **Check the status of the gateway** + + ```yaml + kubectl -n argo-events describe gateway nats-gateway + ``` + + Make sure the gateway is in active state and all the event sources are in running state. + +## Install Sensor +```yaml +kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/sensors/nats.yaml +``` diff --git a/gateways/core/webhook/install.md b/gateways/core/webhook/install.md new file mode 100644 index 0000000000..5d74e65c17 --- /dev/null +++ b/gateways/core/webhook/install.md @@ -0,0 +1,54 @@ +# Webhook Gateway & Sensor + +REST api endpoints act as event sources for gateway + +1. [Example event sources definition](#example-event-sources-definition) +2. [Install gateway](#install-gateway) +3. [Install sensor](#install-sensor) + +## Example event sources definition +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: webhook-gateway-configmap +data: + # each event source defines - + # the port for HTTP server + # endpoint to listen to + # acceptable http method + bar: |- + port: "12000" + endpoint: "/bar" + method: "POST" + foo: |- + port: "12000" + endpoint: "/foo" + method: "POST" +``` + +Create gateway event sources + +```yaml +kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/gateways/webhook-gateway-configmap.yaml +``` + +## Install gateway +1. **Create gateway** + + ```yaml + kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/gateways/webhook-http.yaml + ``` + +2. **Check the status of the gateway** + + ```yaml + kubectl -n argo-events describe gateway webhook-gateway-http + ``` + + Make sure the gateway is in active state and all the event sources are in running state. + +## Install Sensor +```yaml +kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/sensors/webhook-http.yaml +``` From d20bb1604179dee078c9fc8a95089fe1f9e57daf Mon Sep 17 00:00:00 2001 From: vpage Date: Tue, 29 Jan 2019 14:39:44 -0500 Subject: [PATCH 19/22] Updating README --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 64dfec67b9..e5e997f4e3 100644 --- a/README.md +++ b/README.md @@ -38,10 +38,10 @@ Argo Events is an event-based dependency manager for Kubernetes. The core concep
1. [Installation](./docs/quickstart.md) -2. [Sensor and gateway controllers](controllers-guide.md) -3. [Learn about gateways](gateway-guide.md) -4. [Learn about sensors](sensor-guide.md) -5. [Learn about triggers](trigger-guide.md) +2. [Sensor and gateway controllers](docs/controllers-guide.md) +3. [Learn about gateways](docs/gateway-guide.md) +4. [Learn about sensors](docs/sensor-guide.md) +5. [Learn about triggers](docs/trigger-guide.md) 6. [Install Gateways and Sensors]() 1. [Webhook](gateways/core/webhook/install.md) 2. [Artifact](gateways/core/artifact/install.md) From da82d39b9c1d1a3ec7e03d6b1fe2e40b4cf1df1f Mon Sep 17 00:00:00 2001 From: vpage Date: Tue, 29 Jan 2019 15:42:49 -0500 Subject: [PATCH 20/22] Updating gateway installation docs --- README.md | 4 ++-- ROADMAP.md | 1 + docs/quickstart.md | 3 --- docs/sensor-guide.md | 5 ++++- gateways/core/artifact/install.md | 4 ++++ gateways/core/calendar/install.md | 7 ++++++- gateways/core/file/install.md | 11 +++++++++++ gateways/core/resource/install.md | 4 ++++ gateways/core/stream/amqp/install.md | 4 ++++ gateways/core/stream/kafka/install.md | 4 ++++ gateways/core/stream/mqtt/install.md | 4 ++++ gateways/core/stream/nats/install.md | 4 ++++ gateways/core/webhook/install.md | 14 ++++++++++++++ 13 files changed, 62 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index e5e997f4e3..979bfd834b 100644 --- a/README.md +++ b/README.md @@ -42,13 +42,13 @@ Argo Events is an event-based dependency manager for Kubernetes. The core concep 3. [Learn about gateways](docs/gateway-guide.md) 4. [Learn about sensors](docs/sensor-guide.md) 5. [Learn about triggers](docs/trigger-guide.md) -6. [Install Gateways and Sensors]() +6. Install Gateways and Sensors 1. [Webhook](gateways/core/webhook/install.md) 2. [Artifact](gateways/core/artifact/install.md) 3. [Calendar](gateways/core/calendar/install.md) 4. [Resource](gateways/core/resource/install.md) 5. [File](gateways/core/file/install.md) - 6. [Streams]() + 6. Streams 1. [NATS](gateways/core/stream/nats/install.md) 2. [KAFKA](gateways/core/stream/kafka/install.md) 3. [AMQP](gateways/core/stream/amqp/install.md) diff --git a/ROADMAP.md b/ROADMAP.md index d226e8607b..192022a392 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -1,6 +1,7 @@ # Roadmap ## Development Phase +- Boolean logic for event dependencies in sensor - E2E testing ## Idea Phase diff --git a/docs/quickstart.md b/docs/quickstart.md index d8d7597315..fe7484fae9 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -69,6 +69,3 @@ argo list -n argo-events ``` To debug, check the logs of the sensor-controller pod, gateway-controller, associated gateways and sensors. - -## 7. Next steps -* [Follow the tutorial on gateways and sensors](tutorial.md) diff --git a/docs/sensor-guide.md b/docs/sensor-guide.md index da30cd1ed4..461c9428a5 100644 --- a/docs/sensor-guide.md +++ b/docs/sensor-guide.md @@ -12,7 +12,10 @@ Sensors define a set of dependencies (inputs) and actions (outputs). The sensor' https://github.com/argoproj/argo-events/blob/master/docs/sensor-protocol.md ## Dependencies -A sensor can contain list of event dependencies and a dependency is defined as "gateway-name:event-source-name" +A sensor can contain list of event dependencies and a dependency is defined as "gateway-name:event-source-name". + +**Note**: If a sensor defines more than one event dependencies then it will wait for all of these events to happen, +then only it will trigger workflow/s. Basically, waiting for event dependencies is a `AND` operation. ## Triggers Refer [Triggers](trigger-guide.md) guide. diff --git a/gateways/core/artifact/install.md b/gateways/core/artifact/install.md index 1ba03cebdb..aeb49b10e2 100644 --- a/gateways/core/artifact/install.md +++ b/gateways/core/artifact/install.md @@ -5,6 +5,7 @@ Minio bucket notifications acts as event sources for artifact gateway. To setup 1. [Example event sources definition](#example-event-sources-definition) 2. [Install gateway](#install-gateway) 3. [Install sensor](#install-sensor) +4. [Trigger Workflow](#trigger-workflow) ## Example event sources definition ```yaml @@ -54,3 +55,6 @@ Pre-requisite - create necessary buckets in Minio. ```yaml kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/sensors/artifact.yaml ``` + +## Trigger workflow +Drop a file onto `input` bucket and monitor workflows \ No newline at end of file diff --git a/gateways/core/calendar/install.md b/gateways/core/calendar/install.md index 931e099fdb..1593209e4b 100644 --- a/gateways/core/calendar/install.md +++ b/gateways/core/calendar/install.md @@ -5,6 +5,7 @@ Intervals or cron schedules act as event sources for calendar gateway. 1. [Example event sources definition](#example-event-sources-definition) 2. [Install gateway](#install-gateway) 3. [Install sensor](#install-sensor) +4. [Trigger Workflow](#trigger-workflow) ## Example event sources definition ```yaml @@ -14,7 +15,7 @@ metadata: name: calendar-gateway-configmap data: interval: |- - interval: 10s # event is generated after every 10 seconds + interval: 55s # event is generated after every 10 seconds schedule: |- schedule: 30 * * * * # event is generated after 30 min past every hour ``` @@ -42,3 +43,7 @@ kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/m ```yaml kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/sensors/calendar.yaml ``` + +## Trigger Workflow +Wait for 55 seconds to pass or if the sensor has `calendar-gateway:schedule` as event dependency, then wait for 30 min past each hour +for workflow to trigger. \ No newline at end of file diff --git a/gateways/core/file/install.md b/gateways/core/file/install.md index 424743b366..ae5bb43d8b 100644 --- a/gateways/core/file/install.md +++ b/gateways/core/file/install.md @@ -5,6 +5,7 @@ File system serves as event source for file gateway 1. [Example event sources definition](#example-event-sources-definition) 2. [Install gateway](#install-gateway) 3. [Install sensor](#install-sensor) +4. [Trigger Workflow](#trigger-workflow) ## Example event sources definition ```yaml @@ -19,6 +20,13 @@ data: path: x.txt # file to watch to ``` +Supported file events are - +* Create +* Write +* Remove +* Rename +* Chmod + ```yaml kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/gateways/file-gateway-configmap.yaml ``` @@ -44,3 +52,6 @@ Pre-requisite - The file system you want to watch must be mounted in gateway pod ```yaml kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/sensors/file.yaml ``` + +## Trigger Workflow +Go to the directory specified in event source and create a file. diff --git a/gateways/core/resource/install.md b/gateways/core/resource/install.md index 94fed8d513..9e2419432c 100644 --- a/gateways/core/resource/install.md +++ b/gateways/core/resource/install.md @@ -5,6 +5,7 @@ K8s resources act as event sources for Resource gateway 1. [Example event sources definition](#example-event-sources-definition) 2. [Install gateway](#install-gateway) 3. [Install sensor](#install-sensor) +4. [Trigger Workflow](#trigger-workflow) ## Example event sources definition ```yaml @@ -58,3 +59,6 @@ kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/m ```yaml kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/sensors/resource.yaml ``` + +## Trigger workflow +Create an argo workflow with name `my-workflow`. As soon as `my-workflow` succeeds, a new workflow will be triggered. \ No newline at end of file diff --git a/gateways/core/stream/amqp/install.md b/gateways/core/stream/amqp/install.md index 9e56722dce..1ef4d555eb 100644 --- a/gateways/core/stream/amqp/install.md +++ b/gateways/core/stream/amqp/install.md @@ -3,6 +3,7 @@ 1. [Example event sources definition](#example-event-sources-definition) 2. [Install gateway](#install-gateway) 3. [Install sensor](#install-sensor) +4. [Trigger Workflow](#trigger-workflow) ## Example event sources definition ```yaml @@ -48,3 +49,6 @@ kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/m ```yaml kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/sensors/amqp.yaml ``` + +## Trigger workflow +Send a message to exchange name `foo` with exchange type `fanout` and routing key as `fooK` on amqp://amqp.argo-events:5672 \ No newline at end of file diff --git a/gateways/core/stream/kafka/install.md b/gateways/core/stream/kafka/install.md index 6f0d0462ab..fcc10bdaff 100644 --- a/gateways/core/stream/kafka/install.md +++ b/gateways/core/stream/kafka/install.md @@ -5,6 +5,7 @@ Kafka topics act as event sources for gateway 1. [Example event sources definition](#example-event-sources-definition) 2. [Install gateway](#install-gateway) 3. [Install sensor](#install-sensor) +4. [Trigger Workflow](#trigger-workflow) ## Example event sources definition ```yaml @@ -48,3 +49,6 @@ kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/m ```yaml kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/sensors/kafka.yaml ``` + +## Trigger Workflow +Send a message to topic `foo` on partition `0`. You might find this useful https://kafka.apache.org/quickstart#quickstart_send \ No newline at end of file diff --git a/gateways/core/stream/mqtt/install.md b/gateways/core/stream/mqtt/install.md index 12ddb4af62..8f2c50db47 100644 --- a/gateways/core/stream/mqtt/install.md +++ b/gateways/core/stream/mqtt/install.md @@ -3,6 +3,7 @@ 1. [Example event sources definition](#example-event-sources-definition) 2. [Install gateway](#install-gateway) 3. [Install sensor](#install-sensor) +4. [Trigger Workflow](#trigger-workflow) ## Example event sources definition ```yaml @@ -44,3 +45,6 @@ kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/m ```yaml kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/sensors/mqtt.yaml ``` + +## Trigger Workflow +Publish message to topic `foo`. You might find this helpful https://www.ev3dev.org/docs/tutorials/sending-and-receiving-messages-with-mqtt/ \ No newline at end of file diff --git a/gateways/core/stream/nats/install.md b/gateways/core/stream/nats/install.md index ab6cb9c3f1..43d6849e4f 100644 --- a/gateways/core/stream/nats/install.md +++ b/gateways/core/stream/nats/install.md @@ -5,6 +5,7 @@ NATS subjects act as event sources for gateway 1. [Example event sources definition](#example-event-sources-definition) 2. [Install gateway](#install-gateway) 3. [Install sensor](#install-sensor) +4. [Trigger Workflow](#trigger-workflow) ## Example event sources definition ```yaml @@ -43,3 +44,6 @@ kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/m ```yaml kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/sensors/nats.yaml ``` + +## Trigger Workflow +Publish message to subject `foo`. You might find this useful https://github.com/nats-io/go-nats/tree/master/examples/nats-pub diff --git a/gateways/core/webhook/install.md b/gateways/core/webhook/install.md index 5d74e65c17..934292d02f 100644 --- a/gateways/core/webhook/install.md +++ b/gateways/core/webhook/install.md @@ -5,6 +5,7 @@ REST api endpoints act as event sources for gateway 1. [Example event sources definition](#example-event-sources-definition) 2. [Install gateway](#install-gateway) 3. [Install sensor](#install-sensor) +4. [Trigger Workflow](#trigger-workflow) ## Example event sources definition ```yaml @@ -52,3 +53,16 @@ kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/m ```yaml kubectl -n argo-events create -f https://github.com/argoproj/argo-events/blob/master/examples/sensors/webhook-http.yaml ``` + +## Trigger Workflow +Note: the `WEBHOOK_SERVICE_URL` will differ based on the Kubernetes cluster. +``` +export WEBHOOK_SERVICE_URL=$(minikube service -n argo-events --url ) +echo $WEBHOOK_SERVICE_URL +curl -d '{"message":"this is my first webhook"}' -H "Content-Type: application/json" -X POST $WEBHOOK_SERVICE_URL/foo +``` + +Note: + * If you are facing an issue getting service url by running `minikube service -n argo-events --url `, you can use `kubectl port-forward` + * Open another terminal window and enter `kubectl port-forward -n argo-events 9003:` + * You can now use `localhost:9003` to query webhook gateway From 7bcc42fa7bd62471f9119cfc389e9880a1f3de4f Mon Sep 17 00:00:00 2001 From: vpage Date: Tue, 29 Jan 2019 16:02:23 -0500 Subject: [PATCH 21/22] Updating makefile --- Makefile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 8757678e9d..ecc0955b10 100644 --- a/Makefile +++ b/Makefile @@ -194,33 +194,33 @@ mqtt-image: mqtt-linux # Custom gateways storage-grid: - CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -v -ldflags '${LDFLAGS}' -o ${DIST_DIR}/storagegrid-gateway ./gateways/custom/storagegrid/cmd + CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -v -ldflags '${LDFLAGS}' -o ${DIST_DIR}/storagegrid-gateway ./gateways/community/storagegrid/cmd storage-grid-linux: CGO_ENABLED=0 GOOS=linux GOARCH=amd64 make storage-grid storage-grid-image: storage-grid-linux - docker build -t $(IMAGE_PREFIX)storage-grid-gateway:$(IMAGE_TAG) -f ./gateways/custom/storagegrid/Dockerfile . + docker build -t $(IMAGE_PREFIX)storage-grid-gateway:$(IMAGE_TAG) -f ./gateways/community/storagegrid/Dockerfile . @if [ "$(DOCKER_PUSH)" = "true" ] ; then docker push $(IMAGE_PREFIX)storage-grid-gateway:$(IMAGE_TAG) ; fi gitlab: - CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -v -ldflags '${LDFLAGS}' -o ${DIST_DIR}/gitlab-gateway ./gateways/custom/gitlab/cmd + CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -v -ldflags '${LDFLAGS}' -o ${DIST_DIR}/gitlab-gateway ./gateways/community/gitlab/cmd gitlab-linux: CGO_ENABLED=0 GOOS=linux GOARCH=amd64 make gitlab gitlab-image: gitlab-linux - docker build -t $(IMAGE_PREFIX)gitlab-gateway:$(IMAGE_TAG) -f ./gateways/custom/gitlab/Dockerfile . + docker build -t $(IMAGE_PREFIX)gitlab-gateway:$(IMAGE_TAG) -f ./gateways/community/gitlab/Dockerfile . @if [ "$(DOCKER_PUSH)" = "true" ] ; then docker push $(IMAGE_PREFIX)gitlab-gateway:$(IMAGE_TAG) ; fi github: - CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -v -ldflags '${LDFLAGS}' -o ${DIST_DIR}/github-gateway ./gateways/custom/github/cmd + CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -v -ldflags '${LDFLAGS}' -o ${DIST_DIR}/github-gateway ./gateways/community/github/cmd github-linux: CGO_ENABLED=0 GOOS=linux GOARCH=amd64 make github github-image: github-linux - docker build -t $(IMAGE_PREFIX)github-gateway:$(IMAGE_TAG) -f ./gateways/custom/github/Dockerfile . + docker build -t $(IMAGE_PREFIX)github-gateway:$(IMAGE_TAG) -f ./gateways/community/github/Dockerfile . @if [ "$(DOCKER_PUSH)" = "true" ] ; then docker push $(IMAGE_PREFIX)github-gateway:$(IMAGE_TAG) ; fi test: From 14b59f31ac9b1c05cc4358bf0a8870a64a7c6640 Mon Sep 17 00:00:00 2001 From: vpage Date: Tue, 29 Jan 2019 16:10:52 -0500 Subject: [PATCH 22/22] Updating makefile --- examples/sensors/webhook-http.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/sensors/webhook-http.yaml b/examples/sensors/webhook-http.yaml index 869e553ca4..78db19e201 100644 --- a/examples/sensors/webhook-http.yaml +++ b/examples/sensors/webhook-http.yaml @@ -10,7 +10,7 @@ spec: - name: "sensor" image: "argoproj/sensor" imagePullPolicy: Always - serviceAccountName: argo-events + serviceAccountName: argo-events-sa dependencies: - name: "webhook-gateway-http:foo" eventProtocol: